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

Commit 1426e754 authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[SB] Remove launched status_bar_signal_policy_refactor.

Bug: 264539100
Flag: EXEMPT cleanup
Test: airplane mode icon in status bar still works
Test: atest StatusBarSignalPolicyTest
Change-Id: Id50b5d343e7af633432130640c824542ed4642bb
parent e9f4fdcc
Loading
Loading
Loading
Loading
+0 −7
Original line number Diff line number Diff line
@@ -391,13 +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_system_status_icons_in_compose"
  namespace: "systemui"
+1 −79
Original line number Diff line number Diff line
@@ -16,19 +16,13 @@

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
@@ -43,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)
@@ -58,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,
@@ -84,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)
@@ -98,71 +85,6 @@ 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)
    fun ethernetIconViaInteractor_iconUpdated() =
        kosmos.runTest {
            underTest.start()
+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);
+2 −73
Original line number Diff line number Diff line
@@ -16,22 +16,17 @@

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;
@@ -45,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;
@@ -59,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;
@@ -71,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,
@@ -88,7 +76,6 @@ public class StatusBarSignalPolicy

        mIconController = iconController;
        mJavaAdapter = javaAdapter;
        mNetworkController = networkController;
        mSecurityController = securityController;
        mTunerService = tunerService;
        mAirplaneModeInteractor = airplaneModeInteractor;
@@ -102,12 +89,7 @@ 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(
@@ -115,30 +97,6 @@ public class StatusBarSignalPolicy
        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);
        }
        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();
        int vpnIconId = currentVpnIconId(
@@ -185,9 +143,6 @@ public class StatusBarSignalPolicy
            mHideAirplane = hideAirplane;
            mHideMobile = hideMobile;
            mHideEthernet = hideEthernet;
            // Re-register to get new callbacks.
            mNetworkController.removeCallback(this);
            mNetworkController.addCallback(this);
        }
    }

@@ -203,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)
}