Display one row item per Ethernet interface

This change adds a preference category to host rows for ethernet
interfaces.

Flag: com.android.settings.connectivity.ethernet_settings

Test: atest
SettingsRoboTests:
com.android.settings.network.NetworkProviderSettingsTest

Bug: 369889610

Change-Id: Idb37cbf17f06db2c9a217659affb35d9dcebadf3
This commit is contained in:
Nikhil Nayunigari
2025-01-21 19:50:40 +00:00
parent 17793e3c26
commit 25c5971e89
9 changed files with 202 additions and 34 deletions

View File

@@ -48,6 +48,7 @@ import android.content.Intent;
import android.content.res.Resources;
import android.location.LocationManager;
import android.net.EthernetManager;
import android.net.IpConfiguration;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
@@ -73,6 +74,8 @@ import com.android.settings.AirplaneModeEnabler;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.datausage.DataUsagePreference;
import com.android.settings.network.ethernet.EthernetInterface;
import com.android.settings.network.ethernet.EthernetTracker;
import com.android.settings.testutils.shadow.ShadowDataUsageUtils;
import com.android.settings.testutils.shadow.ShadowFragment;
import com.android.settings.wifi.AddWifiNetworkPreference;
@@ -90,6 +93,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.Spy;
@@ -102,6 +106,7 @@ import org.robolectric.annotation.Implements;
import org.robolectric.shadows.ShadowToast;
import org.robolectric.util.ReflectionHelpers;
import java.util.ArrayList;
import java.util.List;
@RunWith(RobolectricTestRunner.class)
@@ -160,6 +165,10 @@ public class NetworkProviderSettingsTest {
NetworkProviderSettings.WifiRestriction mWifiRestriction;
@Mock
EthernetManager mEtherentManager;
@Mock
EthernetTracker mEthernetTracker;
@Mock
PreferenceCategory mEthernetPreferenceCategory;
private NetworkProviderSettings mNetworkProviderSettings;
@@ -194,6 +203,7 @@ public class NetworkProviderSettingsTest {
mNetworkProviderSettings.mAirplaneModeMsgPreference = mAirplaneModeMsgPreference;
mNetworkProviderSettings.mAirplaneModeEnabler = mAirplaneModeEnabler;
mNetworkProviderSettings.mInternetUpdater = mInternetUpdater;
mNetworkProviderSettings.mEthernetTracker = mEthernetTracker;
mNetworkProviderSettings.mWifiStatusMessagePreference = new FooterPreference(mContext);
doReturn(NetworkProviderSettings.PREF_KEY_CONNECTED_ACCESS_POINTS)
.when(mConnectedWifiEntryPreferenceCategory).getKey();
@@ -203,6 +213,7 @@ public class NetworkProviderSettingsTest {
.when(mFirstWifiEntryPreferenceCategory).getKey();
mNetworkProviderSettings.mFirstWifiEntryPreferenceCategory =
mFirstWifiEntryPreferenceCategory;
mNetworkProviderSettings.mEthernetPreferenceCategory = mEthernetPreferenceCategory;
ReflectionHelpers.setField(mNetworkProviderSettings, "mDashboardFeatureProvider",
mock(DashboardFeatureProvider.class));
@@ -749,6 +760,8 @@ public class NetworkProviderSettingsTest {
public void onStop_shouldRemoveCallbacks() {
View fragmentView = mock(View.class);
when(mNetworkProviderSettings.getView()).thenReturn(fragmentView);
doNothing().when(mEthernetTracker)
.unregisterInterfaceListener(any());
mNetworkProviderSettings.onStop();
@@ -925,6 +938,57 @@ public class NetworkProviderSettingsTest {
verify(mContext).startActivity(any());
}
@Test
public void updateEthernetInterfaces_withEmptyInterfaces() {
doNothing().when(mEthernetPreferenceCategory).removeAll();
mNetworkProviderSettings.updateEthernetInterfaces(new ArrayList<EthernetInterface>());
verify(mEthernetPreferenceCategory).removeAll();
verify(mEthernetPreferenceCategory).setVisible(false);
}
@Test
public void updateEthernetInterfaces_withConnectedInterface() {
List<EthernetInterface> interfaces = new ArrayList<>();
EthernetInterface ethernetInterface = new EthernetInterface(mContext, "eth0");
ethernetInterface.onInterfaceStateChanged(
"eth0", EthernetManager.STATE_LINK_UP, 0, new IpConfiguration());
interfaces.add(ethernetInterface);
mNetworkProviderSettings.updateEthernetInterfaces(interfaces);
ArgumentCaptor<Preference> arg = ArgumentCaptor.forClass(Preference.class);
verify(mEthernetPreferenceCategory).removeAll();
verify(mEthernetPreferenceCategory).setVisible(true);
verify(mEthernetPreferenceCategory).addPreference(arg.capture());
Preference pref = arg.getValue();
assertThat(pref.getKey()).isEqualTo("eth0");
assertThat(pref.getSummary()).isEqualTo("Connected");
}
@Test
public void updateEthernetInterfaces_withDisconnectedInterface() {
List<EthernetInterface> interfaces = new ArrayList<>();
EthernetInterface ethernetInterface = new EthernetInterface(mContext, "eth0");
ethernetInterface.onInterfaceStateChanged(
"eth0", EthernetManager.STATE_LINK_DOWN, 0, new IpConfiguration());
interfaces.add(ethernetInterface);
mNetworkProviderSettings.updateEthernetInterfaces(interfaces);
ArgumentCaptor<Preference> arg = ArgumentCaptor.forClass(Preference.class);
verify(mEthernetPreferenceCategory).addPreference(arg.capture());
Preference pref = arg.getValue();
assertThat(pref.getSummary()).isEqualTo("Disconnected");
}
@Implements(PreferenceFragmentCompat.class)
public static class ShadowPreferenceFragmentCompat {

View File

@@ -30,7 +30,7 @@ import org.junit.runner.RunWith
import org.mockito.kotlin.mock
@RunWith(AndroidJUnit4::class)
class EthernetInterfaceTrackerTest {
class EthernetTrackerImplTest {
private val mockEthernetManager = mock<EthernetManager>()
private val context: Context =
@@ -42,38 +42,38 @@ class EthernetInterfaceTrackerTest {
}
}
private val ethernetInterfaceTracker = EthernetInterfaceTracker.getInstance(context)
private val ethernetTrackerImpl = EthernetTrackerImpl.getInstance(context)
@Test
fun getInterface_shouldReturnEmpty() {
assertNull(ethernetInterfaceTracker.getInterface("id0"))
assertNull(ethernetTrackerImpl.getInterface("id0"))
}
@Test
fun getAvailableInterfaces_shouldReturnEmpty() {
assertEquals(ethernetInterfaceTracker.availableInterfaces.size, 0)
assertEquals(ethernetTrackerImpl.availableInterfaces.size, 0)
}
@Test
fun interfacesChanged_shouldUpdateInterfaces() {
ethernetInterfaceTracker.onInterfaceStateChanged(
ethernetTrackerImpl.onInterfaceStateChanged(
"id0",
EthernetManager.STATE_LINK_DOWN,
EthernetManager.ROLE_NONE,
IpConfiguration(),
)
assertNotNull(ethernetInterfaceTracker.getInterface("id0"))
assertEquals(ethernetInterfaceTracker.availableInterfaces.size, 1)
assertNotNull(ethernetTrackerImpl.getInterface("id0"))
assertEquals(ethernetTrackerImpl.availableInterfaces.size, 1)
ethernetInterfaceTracker.onInterfaceStateChanged(
ethernetTrackerImpl.onInterfaceStateChanged(
"id0",
EthernetManager.STATE_ABSENT,
EthernetManager.ROLE_NONE,
IpConfiguration(),
)
assertNull(ethernetInterfaceTracker.getInterface("id0"))
assertEquals(ethernetInterfaceTracker.availableInterfaces.size, 0)
assertNull(ethernetTrackerImpl.getInterface("id0"))
assertEquals(ethernetTrackerImpl.availableInterfaces.size, 0)
}
}