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

Commit aac730e0 authored by Caitlin Shkuratov's avatar Caitlin Shkuratov Committed by Android (Google) Code Review
Browse files

Merge changes Id50b5d34,I3f98d0dc into main

* changes:
  [SB] Remove launched status_bar_signal_policy_refactor.
  [SB] Remove launched status_bar_signal_policy_refactor_ethernet.
parents e352e54b 1426e754
Loading
Loading
Loading
Loading
+0 −14
Original line number Diff line number Diff line
@@ -391,20 +391,6 @@ flag {
    }
}

flag {
   name: "status_bar_signal_policy_refactor"
   namespace: "systemui"
   description: "Use a settings observer for airplane mode and make StatusBarSignalPolicy startable"
   bug: "264539100"
}

flag {
   name: "status_bar_signal_policy_refactor_ethernet"
   namespace: "systemui"
   description: "Use recommended architecture for ethernet icon in status bar"
   bug: "291321279"
}

flag {
  name: "status_bar_system_status_icons_in_compose"
  namespace: "systemui"
+2 −150
Original line number Diff line number Diff line
@@ -16,24 +16,17 @@

package com.android.systemui.statusbar

import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.internal.R
import com.android.systemui.Flags.FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR
import com.android.systemui.SysuiTestCase
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.res.R.drawable.stat_sys_airplane_mode
import com.android.systemui.statusbar.connectivity.IconState
import com.android.systemui.statusbar.connectivity.NetworkController
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.airplaneModeInteractor
import com.android.systemui.statusbar.pipeline.ethernet.domain.ethernetInteractor
import com.android.systemui.statusbar.pipeline.ethernet.shared.StatusBarSignalPolicyRefactorEthernet
import com.android.systemui.statusbar.pipeline.shared.data.repository.connectivityRepository
import com.android.systemui.statusbar.pipeline.shared.data.repository.fake
import com.android.systemui.statusbar.policy.SecurityController
@@ -44,12 +37,8 @@ import kotlin.test.Test
import org.junit.Before
import org.junit.runner.RunWith
import org.mockito.Mockito.verify
import org.mockito.kotlin.any
import org.mockito.kotlin.clearInvocations
import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
import org.mockito.kotlin.never
import org.mockito.kotlin.verifyNoMoreInteractions

@SmallTest
@RunWith(AndroidJUnit4::class)
@@ -59,14 +48,12 @@ class StatusBarSignalPolicyTest : SysuiTestCase() {

    private val securityController = mock<SecurityController>()
    private val statusBarIconController = mock<StatusBarIconController>()
    private val networkController = mock<NetworkController>()

    private val Kosmos.underTest by
        Kosmos.Fixture {
            StatusBarSignalPolicy(
                mContext,
                statusBarIconController,
                networkController,
                securityController,
                tunerService,
                javaAdapter,
@@ -85,8 +72,7 @@ class StatusBarSignalPolicyTest : SysuiTestCase() {
    }

    @Test
    @EnableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
    fun airplaneModeViaInteractor_statusBarSignalPolicyRefactorFlagEnabled_iconUpdated() =
    fun airplaneModeViaInteractor_iconUpdated() =
        kosmos.runTest {
            underTest.start()
            clearInvocations(statusBarIconController)
@@ -99,141 +85,7 @@ class StatusBarSignalPolicyTest : SysuiTestCase() {
        }

    @Test
    @EnableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
    fun airplaneModeViaSignalCallback_statusBarSignalPolicyRefactorFlagEnabled_iconNotUpdated() =
        kosmos.runTest {
            underTest.start()
            clearInvocations(statusBarIconController)

            // Make sure the legacy code path does not change airplane mode when the refactor
            // flag is enabled.
            underTest.setIsAirplaneMode(IconState(true, stat_sys_airplane_mode, ""))
            verify(statusBarIconController, never()).setIconVisibility(eq(slotAirplane), any())

            underTest.setIsAirplaneMode(IconState(false, stat_sys_airplane_mode, ""))
            verify(statusBarIconController, never()).setIconVisibility(eq(slotAirplane), any())
        }

    @Test
    @EnableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
    fun statusBarSignalPolicyInitialization_statusBarSignalPolicyRefactorFlagEnabled_initNoOp() =
        kosmos.runTest {
            // Make sure StatusBarSignalPolicy.init does no initialization when
            // the refactor flag is disabled.
            underTest.init()
            verifyNoMoreInteractions(securityController, networkController, tunerService)
        }

    @Test
    @DisableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
    fun airplaneModeViaSignalCallback_statusBarSignalPolicyRefactorFlagDisabled_iconUpdated() =
        kosmos.runTest {
            underTest.init()

            underTest.setIsAirplaneMode(IconState(true, stat_sys_airplane_mode, ""))
            verify(statusBarIconController).setIconVisibility(slotAirplane, true)

            underTest.setIsAirplaneMode(IconState(false, stat_sys_airplane_mode, ""))
            verify(statusBarIconController).setIconVisibility(slotAirplane, false)
        }

    @Test
    @DisableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
    fun airplaneModeViaInteractor_statusBarSignalPolicyRefactorFlagDisabled_iconNotUpdated() =
        kosmos.runTest {
            underTest.init()

            // Make sure changing airplane mode from airplaneModeRepository does nothing
            // if the StatusBarSignalPolicyRefactor is not enabled.
            airplaneModeInteractor.setIsAirplaneMode(true)
            verify(statusBarIconController, never()).setIconVisibility(eq(slotAirplane), any())

            airplaneModeInteractor.setIsAirplaneMode(false)
            verify(statusBarIconController, never()).setIconVisibility(eq(slotAirplane), any())
        }

    @Test
    @DisableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
    fun statusBarSignalPolicyInitialization_statusBarSignalPolicyRefactorFlagDisabled_startNoOp() =
        kosmos.runTest {
            // Make sure StatusBarSignalPolicy.start does no initialization when
            // the refactor flag is disabled.
            underTest.start()
            verifyNoMoreInteractions(securityController, networkController, tunerService)
        }

    @Test
    @EnableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
    @DisableFlags(StatusBarSignalPolicyRefactorEthernet.FLAG_NAME)
    fun ethernetIconViaSignalCallback_refactorFlagDisabled_iconUpdated() =
        kosmos.runTest {
            underTest.start()
            clearInvocations(statusBarIconController)

            underTest.setEthernetIndicators(
                IconState(/* visible= */ true, /* icon= */ 1, /* contentDescription= */ "Ethernet")
            )
            verify(statusBarIconController).setIconVisibility(slotEthernet, true)

            underTest.setEthernetIndicators(
                IconState(
                    /* visible= */ false,
                    /* icon= */ 0,
                    /* contentDescription= */ "No ethernet",
                )
            )
            verify(statusBarIconController).setIconVisibility(slotEthernet, false)
        }

    @Test
    @EnableFlags(
        FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR,
        StatusBarSignalPolicyRefactorEthernet.FLAG_NAME,
    )
    fun ethernetIconViaSignalCallback_refactorFlagEnabled_iconNotUpdated() =
        kosmos.runTest {
            underTest.start()
            clearInvocations(statusBarIconController)

            underTest.setEthernetIndicators(
                IconState(/* visible= */ true, /* icon= */ 1, /* contentDescription= */ "Ethernet")
            )
            verify(statusBarIconController, never()).setIconVisibility(eq(slotEthernet), any())

            underTest.setEthernetIndicators(
                IconState(
                    /* visible= */ false,
                    /* icon= */ 0,
                    /* contentDescription= */ "No ethernet",
                )
            )
            verify(statusBarIconController, never()).setIconVisibility(eq(slotEthernet), any())
        }

    @Test
    @EnableFlags(FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR)
    @DisableFlags(StatusBarSignalPolicyRefactorEthernet.FLAG_NAME)
    fun ethernetIconViaInteractor_refactorFlagDisabled_iconNotUpdated() =
        kosmos.runTest {
            underTest.start()
            clearInvocations(statusBarIconController)

            connectivityRepository.fake.setEthernetConnected(default = true, validated = true)
            verify(statusBarIconController, never()).setIconVisibility(eq(slotEthernet), any())

            connectivityRepository.fake.setEthernetConnected(default = false, validated = false)
            verify(statusBarIconController, never()).setIconVisibility(eq(slotEthernet), any())

            connectivityRepository.fake.setEthernetConnected(default = true, validated = false)
            verify(statusBarIconController, never()).setIconVisibility(eq(slotEthernet), any())
        }

    @Test
    @EnableFlags(
        FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR,
        StatusBarSignalPolicyRefactorEthernet.FLAG_NAME,
    )
    fun ethernetIconViaInteractor_refactorFlagEnabled_iconUpdated() =
    fun ethernetIconViaInteractor_iconUpdated() =
        kosmos.runTest {
            underTest.start()
            clearInvocations(statusBarIconController)
+0 −5
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@ import static androidx.lifecycle.Lifecycle.State.RESUMED;

import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME;
import static com.android.systemui.Flags.keyboardShortcutHelperRewrite;
import static com.android.systemui.Flags.statusBarSignalPolicyRefactor;
import static com.android.systemui.charging.WirelessChargingAnimation.UNKNOWN_BATTERY_LEVEL;
import static com.android.systemui.flags.Flags.SHORTCUT_LIST_SEARCH_LAYOUT;
import static com.android.systemui.shared.Flags.ambientAod;
@@ -877,10 +876,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
        mBubblesOptional.ifPresent(this::initBubbles);
        mKeyguardBypassController.listenForQsExpandedChange();

        if (!statusBarSignalPolicyRefactor()) {
            mStatusBarSignalPolicy.init();
        }

        mKeyguardIndicationController.init();

        mColorExtractor.addOnColorsChangedListener(mOnColorsChangedListener);
+3 −100
Original line number Diff line number Diff line
@@ -16,26 +16,20 @@

package com.android.systemui.statusbar.phone;

import static com.android.systemui.Flags.statusBarSignalPolicyRefactor;
import static com.android.systemui.common.shared.model.ContentDescription.loadContentDescription;

import android.annotation.Nullable;
import android.content.Context;
import android.os.Handler;
import android.util.ArraySet;
import android.util.Log;

import com.android.systemui.CoreStartable;
import com.android.systemui.common.shared.model.Icon;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.connectivity.IconState;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor;
import com.android.systemui.statusbar.pipeline.ethernet.domain.EthernetInteractor;
import com.android.systemui.statusbar.pipeline.ethernet.shared.StatusBarSignalPolicyRefactorEthernet;
import com.android.systemui.statusbar.policy.SecurityController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
@@ -46,13 +40,9 @@ import javax.inject.Inject;
/** Controls the signal policies for icons shown in the statusbar. */
@SysUISingleton
public class StatusBarSignalPolicy
        implements SignalCallback,
                SecurityController.SecurityControllerCallback,
        implements SecurityController.SecurityControllerCallback,
                Tunable,
                CoreStartable {
    private static final String TAG = "StatusBarSignalPolicy";
    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);

    private final String mSlotAirplane;
    private final String mSlotMobile;
    private final String mSlotEthernet;
@@ -60,7 +50,6 @@ public class StatusBarSignalPolicy

    private final Context mContext;
    private final StatusBarIconController mIconController;
    private final NetworkController mNetworkController;
    private final SecurityController mSecurityController;
    private final Handler mHandler = Handler.getMain();
    private final TunerService mTunerService;
@@ -72,13 +61,11 @@ public class StatusBarSignalPolicy
    private boolean mHideMobile;
    private boolean mHideEthernet;

    private boolean mInitialized;

    @Inject
    public StatusBarSignalPolicy(
            Context context,
            StatusBarIconController iconController,
            NetworkController networkController,
            SecurityController securityController,
            TunerService tunerService,
            JavaAdapter javaAdapter,
@@ -89,7 +76,6 @@ public class StatusBarSignalPolicy

        mIconController = iconController;
        mJavaAdapter = javaAdapter;
        mNetworkController = networkController;
        mSecurityController = securityController;
        mTunerService = tunerService;
        mAirplaneModeInteractor = airplaneModeInteractor;
@@ -103,46 +89,13 @@ public class StatusBarSignalPolicy

    @Override
    public void start() {
        if (!statusBarSignalPolicyRefactor()) {
            return;
        }

        mTunerService.addTunable(this, StatusBarIconController.ICON_HIDE_LIST);
        mNetworkController.addCallback(this);
        mSecurityController.addCallback(this);

        mJavaAdapter.alwaysCollectFlow(
                mAirplaneModeInteractor.isAirplaneMode(), this::updateAirplaneModeIcon);
        if (StatusBarSignalPolicyRefactorEthernet.isEnabled()) {
        mJavaAdapter.alwaysCollectFlow(mEthernetInteractor.getIcon(), this::updateEthernetIcon);
    }
    }

    /** Call to initialize and register this class with the system. */
    public void init() {
        if (mInitialized || statusBarSignalPolicyRefactor()) {
            return;
        }
        mInitialized = true;
        mTunerService.addTunable(this, StatusBarIconController.ICON_HIDE_LIST);
        mNetworkController.addCallback(this);
        mSecurityController.addCallback(this);

        if (statusBarSignalPolicyRefactor()) {
            mJavaAdapter.alwaysCollectFlow(
                    mAirplaneModeInteractor.isAirplaneMode(),
                    this::updateAirplaneModeIcon);
        }
        if (StatusBarSignalPolicyRefactorEthernet.isEnabled()) {
            mJavaAdapter.alwaysCollectFlow(mEthernetInteractor.getIcon(), this::updateEthernetIcon);
        }
    }

    public void destroy() {
        mTunerService.removeTunable(this);
        mNetworkController.removeCallback(this);
        mSecurityController.removeCallback(this);
    }

    private void updateVpn() {
        boolean vpnVisible = mSecurityController.isVpnEnabled();
@@ -190,34 +143,10 @@ public class StatusBarSignalPolicy
            mHideAirplane = hideAirplane;
            mHideMobile = hideMobile;
            mHideEthernet = hideEthernet;
            // Re-register to get new callbacks.
            mNetworkController.removeCallback(this);
            mNetworkController.addCallback(this);
        }
    }

    @Override
    public void setEthernetIndicators(IconState state) {
        if (StatusBarSignalPolicyRefactorEthernet.isEnabled()) {
            return;
        }

        int resId = state.icon;
        String description = state.contentDescription;

        if (resId > 0) {
            mIconController.setIcon(mSlotEthernet, resId, description);
            mIconController.setIconVisibility(mSlotEthernet, true);
        } else {
            mIconController.setIconVisibility(mSlotEthernet, false);
        }
    }

    private void updateEthernetIcon(@Nullable Icon.Resource ethernetIcon) {
        if (StatusBarSignalPolicyRefactorEthernet.isUnexpectedlyInLegacyMode()) {
            return;
        }

        if (ethernetIcon != null) {
            mIconController.setIcon(
                    mSlotEthernet,
@@ -229,33 +158,7 @@ public class StatusBarSignalPolicy
        }
    }

    @Override
    public void setIsAirplaneMode(IconState icon) {
        if (statusBarSignalPolicyRefactor()) {
            return;
        }

        if (DEBUG) {
            Log.d(TAG, "setIsAirplaneMode: "
                    + "icon = " + (icon == null ? "" : icon.toString()));
        }
        boolean isAirplaneMode = icon.visible && !mHideAirplane;
        int resId = icon.icon;
        String description = icon.contentDescription;

        if (isAirplaneMode && resId > 0) {
            mIconController.setIcon(mSlotAirplane, resId, description);
            mIconController.setIconVisibility(mSlotAirplane, true);
        } else {
            mIconController.setIconVisibility(mSlotAirplane, false);
        }
    }

    public void updateAirplaneModeIcon(boolean isAirplaneModeOn) {
        if (StatusBarSignalPolicyRefactor.isUnexpectedlyInLegacyMode()) {
            return;
        }

    private void updateAirplaneModeIcon(boolean isAirplaneModeOn) {
        boolean isAirplaneMode = isAirplaneModeOn && !mHideAirplane;
        mIconController.setIconVisibility(mSlotAirplane, isAirplaneMode);
        if (isAirplaneMode) {
+0 −53
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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.statusbar.phone

import com.android.systemui.Flags
import com.android.systemui.flags.FlagToken
import com.android.systemui.flags.RefactorFlagUtils

/** Helper for reading or using the status_bar_signal_policy_refactor flag state. */
@Suppress("NOTHING_TO_INLINE")
object StatusBarSignalPolicyRefactor {
    /** The aconfig flag name */
    const val FLAG_NAME = Flags.FLAG_STATUS_BAR_SIGNAL_POLICY_REFACTOR

    /** A token used for dependency declaration */
    val token: FlagToken
        get() = FlagToken(FLAG_NAME, isEnabled)

    /** Is the refactor enabled */
    @JvmStatic
    inline val isEnabled
        get() = Flags.statusBarSignalPolicyRefactor()

    /**
     * Called to ensure code is only run when the flag is enabled. This protects users from the
     * unintended behaviors caused by accidentally running new logic, while also crashing on an eng
     * build to ensure that the refactor author catches issues in testing.
     */
    @JvmStatic
    inline fun isUnexpectedlyInLegacyMode() =
        RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, FLAG_NAME)

    /**
     * Called to ensure code is only run when the flag is disabled. This will throw an exception if
     * the flag is enabled to ensure that the refactor author catches issues in testing.
     */
    @JvmStatic
    inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME)
}
Loading