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

Commit 687d98d6 authored by Fabian Kozynski's avatar Fabian Kozynski Committed by Android (Google) Code Review
Browse files

Merge "Add ethernet support in CastTile" into main

parents 2154f683 46073fc8
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -711,8 +711,8 @@
     <!-- QuickSettings: Cast detail panel, default device description [CHAR LIMIT=NONE] -->
    <!-- QuickSettings: Cast detail panel, text when there are no items [CHAR LIMIT=NONE] -->
    <string name="quick_settings_cast_detail_empty_text">No devices available</string>
    <!-- QuickSettings: Cast unavailable, text when not connected to WiFi [CHAR LIMIT=NONE] -->
    <string name="quick_settings_cast_no_wifi">Wi\u2011Fi not connected</string>
    <!-- QuickSettings: Cast unavailable, text when not connected to WiFi or ethernet[CHAR LIMIT=NONE] -->
    <string name="quick_settings_cast_no_network">No Wi\u2011Fi or Ethernet connection</string>
    <!-- QuickSettings: Brightness dialog title [CHAR LIMIT=NONE] -->
    <string name="quick_settings_brightness_dialog_title">Brightness</string>
    <!-- QuickSettings: Label for the toggle that controls whether display inversion is enabled. [CHAR LIMIT=NONE] -->
+24 −19
Original line number Diff line number Diff line
@@ -38,7 +38,6 @@ import com.android.internal.app.MediaRouteDialogPresenter;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.res.R;
import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.animation.DialogCuj;
import com.android.systemui.animation.DialogLaunchAnimator;
@@ -53,12 +52,13 @@ import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.QsEventLogger;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.statusbar.connectivity.WifiIndicators;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractor;
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel;
import com.android.systemui.statusbar.pipeline.shared.data.model.DefaultConnectionModel;
import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository;
import com.android.systemui.statusbar.policy.CastController;
import com.android.systemui.statusbar.policy.CastController.CastDevice;
import com.android.systemui.statusbar.policy.HotspotController;
@@ -85,10 +85,9 @@ public class CastTile extends QSTileImpl<BooleanState> {
    private final NetworkController mNetworkController;
    private final DialogLaunchAnimator mDialogLaunchAnimator;
    private final Callback mCallback = new Callback();
    private final WifiInteractor mWifiInteractor;
    private final TileJavaAdapter mJavaAdapter;
    private final FeatureFlags mFeatureFlags;
    private boolean mWifiConnected;
    private boolean mCastTransportAllowed;
    private boolean mHotspotConnected;

    @Inject
@@ -107,7 +106,7 @@ public class CastTile extends QSTileImpl<BooleanState> {
            NetworkController networkController,
            HotspotController hotspotController,
            DialogLaunchAnimator dialogLaunchAnimator,
            WifiInteractor wifiInteractor,
            ConnectivityRepository connectivityRepository,
            TileJavaAdapter javaAdapter,
            FeatureFlags featureFlags
    ) {
@@ -117,7 +116,6 @@ public class CastTile extends QSTileImpl<BooleanState> {
        mKeyguard = keyguardStateController;
        mNetworkController = networkController;
        mDialogLaunchAnimator = dialogLaunchAnimator;
        mWifiInteractor = wifiInteractor;
        mJavaAdapter = javaAdapter;
        mFeatureFlags = featureFlags;
        mController.observe(this, mCallback);
@@ -125,7 +123,11 @@ public class CastTile extends QSTileImpl<BooleanState> {
        if (!mFeatureFlags.isEnabled(SIGNAL_CALLBACK_DEPRECATION)) {
            mNetworkController.observe(this, mSignalCallback);
        } else {
            mJavaAdapter.bind(this, mWifiInteractor.getWifiNetwork(), mNetworkModelConsumer);
            mJavaAdapter.bind(
                    this,
                    connectivityRepository.getDefaultConnections(),
                    mNetworkModelConsumer
            );
        }
        hotspotController.observe(this, mHotspotCallback);
    }
@@ -282,7 +284,7 @@ public class CastTile extends QSTileImpl<BooleanState> {
        }
        state.icon = ResourceIcon.get(state.value ? R.drawable.ic_cast_connected
                : R.drawable.ic_cast);
        if (canCastToWifi() || state.value) {
        if (canCastToNetwork() || state.value) {
            state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
            if (!state.value) {
                state.secondaryLabel = "";
@@ -291,7 +293,7 @@ public class CastTile extends QSTileImpl<BooleanState> {
            state.forceExpandIcon = willPopDialog();
        } else {
            state.state = Tile.STATE_UNAVAILABLE;
            String noWifi = mContext.getString(R.string.quick_settings_cast_no_wifi);
            String noWifi = mContext.getString(R.string.quick_settings_cast_no_network);
            state.secondaryLabel = noWifi;
            state.forceExpandIcon = false;
        }
@@ -308,13 +310,13 @@ public class CastTile extends QSTileImpl<BooleanState> {
                : mContext.getString(R.string.quick_settings_cast_device_default_name);
    }

    private boolean canCastToWifi() {
        return mWifiConnected || mHotspotConnected;
    private boolean canCastToNetwork() {
        return mCastTransportAllowed || mHotspotConnected;
    }

    private void setWifiConnected(boolean connected) {
        if (connected != mWifiConnected) {
            mWifiConnected = connected;
    private void setCastTransportAllowed(boolean connected) {
        if (connected != mCastTransportAllowed) {
            mCastTransportAllowed = connected;
            // Hotspot is not connected, so changes here should update
            if (!mHotspotConnected) {
                refreshState();
@@ -326,14 +328,17 @@ public class CastTile extends QSTileImpl<BooleanState> {
        if (connected != mHotspotConnected) {
            mHotspotConnected = connected;
            // Wifi is not connected, so changes here should update
            if (!mWifiConnected) {
            if (!mCastTransportAllowed) {
                refreshState();
            }
        }
    }

    private final Consumer<WifiNetworkModel> mNetworkModelConsumer = (model) -> {
        setWifiConnected(model instanceof WifiNetworkModel.Active);
    private final Consumer<DefaultConnectionModel> mNetworkModelConsumer = (model) -> {
        boolean isWifiDefault = model.getWifi().isDefault();
        boolean isEthernetDefault = model.getEthernet().isDefault();
        boolean hasCellularTransport = model.getMobile().isDefault();
        setCastTransportAllowed((isWifiDefault || isEthernetDefault) && !hasCellularTransport);
    };

    private final SignalCallback mSignalCallback = new SignalCallback() {
@@ -342,7 +347,7 @@ public class CastTile extends QSTileImpl<BooleanState> {
                    // statusIcon.visible has the connected status information
                    boolean enabledAndConnected = indicators.enabled
                            && (indicators.qsIcon != null && indicators.qsIcon.visible);
                    setWifiConnected(enabledAndConnected);
                    setCastTransportAllowed(enabledAndConnected);
                }
            };

+36 −42
Original line number Diff line number Diff line
@@ -54,11 +54,7 @@ import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.statusbar.connectivity.WifiIndicators;
import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository;
import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository;
import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractor;
import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractorImpl;
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel;
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel.Inactive;
import com.android.systemui.statusbar.policy.CastController;
import com.android.systemui.statusbar.policy.CastController.CastDevice;
import com.android.systemui.statusbar.policy.HotspotController;
@@ -111,7 +107,8 @@ public class CastTileTest extends SysuiTestCase {

    private WifiInteractor mWifiInteractor;
    private final TileJavaAdapter mJavaAdapter = new TileJavaAdapter();
    private final FakeWifiRepository mWifiRepository = new FakeWifiRepository();
    private final FakeConnectivityRepository mConnectivityRepository =
            new FakeConnectivityRepository();
    private final FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags();
    private final TestScope mTestScope = TestScopeProvider.getTestScope();

@@ -124,12 +121,6 @@ public class CastTileTest extends SysuiTestCase {
        mTestableLooper = TestableLooper.get(this);

        when(mHost.getContext()).thenReturn(mContext);

        mWifiInteractor = new WifiInteractorImpl(
                new FakeConnectivityRepository(),
                mWifiRepository,
                mTestScope
        );
    }

    @After
@@ -204,24 +195,40 @@ public class CastTileTest extends SysuiTestCase {
    // SIGNAL_CALLBACK_DEPRECATION flag set to true

    @Test
    public void stateUnavailable_wifiDisabled_newPipeline() {
    public void stateUnavailable_noDefaultNetworks_newPipeline() {
        createAndStartTileNewImpl();
        mWifiRepository.setIsWifiEnabled(false);
        mTestableLooper.processAllMessages();

        assertEquals(Tile.STATE_UNAVAILABLE, mCastTile.getState().state);
    }

    @Test
    public void stateUnavailable_wifiEnabled_notConnected_newPipeline() {
    public void stateUnavailable_mobileConnected_newPipeline() {
        createAndStartTileNewImpl();
        mWifiRepository.setIsWifiEnabled(true);
        mWifiRepository.setWifiNetwork(Inactive.INSTANCE);
        mConnectivityRepository.setMobileConnected(true);
        mTestableLooper.processAllMessages();

        assertEquals(Tile.STATE_UNAVAILABLE, mCastTile.getState().state);
    }

    @Test
    public void stateInactive_wifiConnected_newPipeline() {
        createAndStartTileNewImpl();
        mConnectivityRepository.setWifiConnected(true);
        mTestableLooper.processAllMessages();

        assertEquals(Tile.STATE_INACTIVE, mCastTile.getState().state);
    }

    @Test
    public void stateInactive_ethernetConnected_newPipeline() {
        createAndStartTileNewImpl();
        mConnectivityRepository.setEthernetConnected(true);
        mTestableLooper.processAllMessages();

        assertEquals(Tile.STATE_INACTIVE, mCastTile.getState().state);
    }

    @Test
    public void stateActive_wifiConnectedAndCasting_newPipeline() {
        createAndStartTileNewImpl();
@@ -231,40 +238,27 @@ public class CastTileTest extends SysuiTestCase {
        devices.add(device);
        when(mController.getCastDevices()).thenReturn(devices);

        mWifiRepository.setWifiNetwork(
                new WifiNetworkModel.Active(
                        1 /* networkId */,
                        true /* isValidated */,
                        3 /* level */,
                        "test" /* ssid */,
                        WifiNetworkModel.HotspotDeviceType.NONE,
                        false /* isPasspointAccessPoint */,
                        false /* isOnlineSignUpforPasspointAccessPoint */,
                        null /* passpointProviderFriendlyName */
                ));
        mConnectivityRepository.setWifiConnected(true);

        mTestableLooper.processAllMessages();

        assertEquals(Tile.STATE_ACTIVE, mCastTile.getState().state);
    }

    @Test
    public void stateInactive_wifiConnectedNotCasting_newPipeline() {
    public void stateActive_ethernetConnectedAndCasting_newPipeline() {
        createAndStartTileNewImpl();
        CastController.CastDevice device = new CastController.CastDevice();
        device.state = CastDevice.STATE_CONNECTED;
        List<CastDevice> devices = new ArrayList<>();
        devices.add(device);
        when(mController.getCastDevices()).thenReturn(devices);

        mConnectivityRepository.setEthernetConnected(true);

        mWifiRepository.setWifiNetwork(
                new WifiNetworkModel.Active(
                        1 /* networkId */,
                        true /* isValidated */,
                        3 /* level */,
                        "test" /* ssid */,
                        WifiNetworkModel.HotspotDeviceType.NONE,
                        false /* isPasspointAccessPoint */,
                        false /* isOnlineSignUpforPasspointAccessPoint */,
                        null /* passpointProviderFriendlyName */
                ));
        mTestableLooper.processAllMessages();

        assertEquals(Tile.STATE_INACTIVE, mCastTile.getState().state);
        assertEquals(Tile.STATE_ACTIVE, mCastTile.getState().state);
    }

    // -------------------------------------------------
@@ -512,7 +506,7 @@ public class CastTileTest extends SysuiTestCase {
                mNetworkController,
                mHotspotController,
                mDialogLaunchAnimator,
                mWifiInteractor,
                mConnectivityRepository,
                mJavaAdapter,
                mFeatureFlags
        );
@@ -555,7 +549,7 @@ public class CastTileTest extends SysuiTestCase {
                mNetworkController,
                mHotspotController,
                mDialogLaunchAnimator,
                mWifiInteractor,
                mConnectivityRepository,
                mJavaAdapter,
                mFeatureFlags
        );
+3 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ class FakeConnectivityRepository : ConnectivityRepository {
     * setting mobile connected && validated, since the default state is disconnected && not
     * validated
     */
    @JvmOverloads
    fun setMobileConnected(
        default: Boolean = true,
        validated: Boolean = true,
@@ -53,6 +54,7 @@ class FakeConnectivityRepository : ConnectivityRepository {
    }

    /** Similar convenience method for ethernet */
    @JvmOverloads
    fun setEthernetConnected(
        default: Boolean = true,
        validated: Boolean = true,
@@ -64,6 +66,7 @@ class FakeConnectivityRepository : ConnectivityRepository {
            )
    }

    @JvmOverloads
    fun setWifiConnected(
        default: Boolean = true,
        validated: Boolean = true,