Merge "Add ethernet interface details settings subpage" into main
diff --git a/res/xml/ethernet_interface_details.xml b/res/xml/ethernet_interface_details.xml
new file mode 100644
index 0000000..f2d106f
--- /dev/null
+++ b/res/xml/ethernet_interface_details.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto">
+
+ <com.android.settingslib.widget.LayoutPreference
+ android:key="connection_header"
+ android:layout="@layout/settings_entity_header"
+ android:selectable="false"
+ android:order="-10000"/>
+
+</PreferenceScreen>
diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java
index f0f9470..3f9d495 100644
--- a/src/com/android/settings/network/NetworkProviderSettings.java
+++ b/src/com/android/settings/network/NetworkProviderSettings.java
@@ -71,6 +71,7 @@
import com.android.settings.datausage.DataUsageUtils;
import com.android.settings.location.WifiScanningFragment;
import com.android.settings.network.ethernet.EthernetInterface;
+import com.android.settings.network.ethernet.EthernetInterfaceDetailsFragment;
import com.android.settings.network.ethernet.EthernetSwitchPreferenceController;
import com.android.settings.network.ethernet.EthernetTracker;
import com.android.settings.network.ethernet.EthernetTrackerImpl;
@@ -1116,7 +1117,6 @@
if (interfaces.size() > 0) {
for (EthernetInterface ethernetInterface : interfaces) {
Preference pref = new Preference(getPrefContext());
- pref.setSelectable(false);
pref.setOrder(index++);
pref.setKey(ethernetInterface.getId());
pref.setTitle(getContext().getString(R.string.ethernet_interface_title, index));
@@ -1124,6 +1124,10 @@
(ethernetInterface.getInterfaceState() == EthernetManager.STATE_LINK_UP)
? getContext().getString(R.string.network_connected) :
getContext().getString(R.string.network_disconnected));
+ pref.setOnPreferenceClickListener(preference -> {
+ launchEthernetInterfaceDetailsFragment(preference);
+ return true;
+ });
mEthernetPreferenceCategory.addPreference(pref);
}
mEthernetPreferenceCategory.setVisible(true);
@@ -1174,6 +1178,20 @@
}
@VisibleForTesting
+ void launchEthernetInterfaceDetailsFragment(Preference pref) {
+ final Context context = requireContext();
+
+ final Bundle bundle = new Bundle();
+ bundle.putString("EthernetInterfaceKey", pref.getKey());
+
+ new SubSettingLauncher(context)
+ .setDestination(EthernetInterfaceDetailsFragment.class.getName())
+ .setArguments(bundle)
+ .setSourceMetricsCategory(getMetricsCategory())
+ .launch();
+ }
+
+ @VisibleForTesting
LongPressWifiEntryPreference createLongPressWifiEntryPreference(WifiEntry wifiEntry) {
return new LongPressWifiEntryPreference(getPrefContext(), wifiEntry, this);
}
diff --git a/src/com/android/settings/network/ethernet/EthernetInterfaceDetailsController.kt b/src/com/android/settings/network/ethernet/EthernetInterfaceDetailsController.kt
new file mode 100644
index 0000000..cb3ad1d
--- /dev/null
+++ b/src/com/android/settings/network/ethernet/EthernetInterfaceDetailsController.kt
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2025 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.settings.network.ethernet
+
+import android.content.Context
+import android.net.EthernetManager
+import android.widget.ImageView
+import androidx.preference.PreferenceFragmentCompat
+import androidx.preference.PreferenceScreen
+import com.android.settings.R
+import com.android.settings.widget.EntityHeaderController
+import com.android.settingslib.core.AbstractPreferenceController
+import com.android.settingslib.widget.LayoutPreference
+
+class EthernetInterfaceDetailsController(
+ context: Context,
+ private val fragment: PreferenceFragmentCompat,
+ private val preferenceId: String,
+) : AbstractPreferenceController(context) {
+ private val KEY_HEADER = "ethernet_details"
+
+ private val ethernetManager = context.getSystemService(EthernetManager::class.java)
+ private val ethernetInterface =
+ EthernetTrackerImpl.getInstance(context).getInterface(preferenceId)
+
+ override fun isAvailable(): Boolean {
+ return true
+ }
+
+ override fun getPreferenceKey(): String? {
+ return KEY_HEADER
+ }
+
+ override fun displayPreference(screen: PreferenceScreen) {
+ val headerPref: LayoutPreference? = screen.findPreference(KEY_HEADER)
+
+ val mEntityHeaderController =
+ EntityHeaderController.newInstance(
+ fragment.getActivity(),
+ fragment,
+ headerPref?.findViewById(R.id.entity_header),
+ )
+
+ val iconView: ImageView? = headerPref?.findViewById(R.id.entity_header_icon)
+
+ iconView?.setScaleType(ImageView.ScaleType.CENTER_INSIDE)
+
+ mEntityHeaderController
+ .setLabel("Ethernet")
+ .setSummary(
+ if (ethernetInterface?.getInterfaceState() == EthernetManager.STATE_LINK_UP) {
+ mContext.getString(R.string.network_connected)
+ } else {
+ mContext.getString(R.string.network_disconnected)
+ }
+ )
+ .setSecondSummary("")
+ .setIcon(mContext.getDrawable(R.drawable.ic_settings_ethernet))
+ .done(true /* rebind */)
+ }
+}
diff --git a/src/com/android/settings/network/ethernet/EthernetInterfaceDetailsFragment.kt b/src/com/android/settings/network/ethernet/EthernetInterfaceDetailsFragment.kt
new file mode 100644
index 0000000..a6cf90f
--- /dev/null
+++ b/src/com/android/settings/network/ethernet/EthernetInterfaceDetailsFragment.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2025 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.settings.network.ethernet
+
+import android.app.settings.SettingsEnums
+import android.content.Context
+import android.os.Bundle
+import androidx.annotation.VisibleForTesting
+import com.android.settings.R
+import com.android.settings.dashboard.DashboardFragment
+import com.android.settingslib.core.AbstractPreferenceController
+
+class EthernetInterfaceDetailsFragment : DashboardFragment() {
+ private val TAG = "EthernetInterfaceDetailsFragment"
+ private val ETHERNET_INTERFACE_KEY = "EthernetInterfaceKey"
+ private var preferenceId: String? = null
+
+ override fun onCreate(bundle: Bundle?) {
+ super.onCreate(bundle)
+ preferenceId = bundle?.getString(ETHERNET_INTERFACE_KEY)
+ }
+
+ override public fun getPreferenceScreenResId(): Int {
+ return R.xml.ethernet_interface_details
+ }
+
+ @VisibleForTesting
+ override fun getMetricsCategory(): Int {
+ return SettingsEnums.ETHERNET_SETTINGS
+ }
+
+ override public fun getLogTag(): String {
+ return TAG
+ }
+
+ override public fun createPreferenceControllers(
+ context: Context
+ ): List<AbstractPreferenceController> {
+ return listOf(EthernetInterfaceDetailsController(context, this, preferenceId ?: ""))
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/network/ethernet/EthernetInterfaceDetailsControllerTest.kt b/tests/robotests/src/com/android/settings/network/ethernet/EthernetInterfaceDetailsControllerTest.kt
new file mode 100644
index 0000000..fb8e476
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/network/ethernet/EthernetInterfaceDetailsControllerTest.kt
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2025 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.settings.network.ethernet
+
+import android.content.Context
+import android.content.ContextWrapper
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class EthernetInterfaceDetailsControllerTest {
+ private val ethernetInterfaceDetailsFragment = EthernetInterfaceDetailsFragment()
+
+ private val context: Context =
+ object : ContextWrapper(ApplicationProvider.getApplicationContext()) {}
+
+ private val ethernetInterfaceDetailsController =
+ EthernetInterfaceDetailsController(context, ethernetInterfaceDetailsFragment, "eth0")
+
+ @Test
+ fun isAvailable_ShouldReturnTrue() {
+ assertTrue(ethernetInterfaceDetailsController.isAvailable())
+ }
+
+ @Test
+ fun getPreferencKey_shouldReturnExpectedKey() {
+ assertEquals(ethernetInterfaceDetailsController.getPreferenceKey(), "ethernet_details")
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/network/ethernet/EthernetInterfaceDetailsFragmentTest.kt b/tests/robotests/src/com/android/settings/network/ethernet/EthernetInterfaceDetailsFragmentTest.kt
new file mode 100644
index 0000000..8bf03b9
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/network/ethernet/EthernetInterfaceDetailsFragmentTest.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2025 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.settings.network.ethernet
+
+import android.app.settings.SettingsEnums
+import android.content.Context
+import android.content.ContextWrapper
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.R
+import com.android.settingslib.core.AbstractPreferenceController
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class EthernetInterfaceDetailsFragmentTest {
+ private val ethernetInterfaceDetailsFragment = EthernetInterfaceDetailsFragment()
+
+ private val context: Context =
+ object : ContextWrapper(ApplicationProvider.getApplicationContext()) {}
+
+ @Test
+ fun getMetricsCategory_shouldReturnEthernetSettings() {
+ assertEquals(
+ ethernetInterfaceDetailsFragment.getMetricsCategory(),
+ SettingsEnums.ETHERNET_SETTINGS,
+ )
+ }
+
+ @Test
+ fun getPreferenceScreenId_shouldReturnExpectedResource() {
+ assertEquals(
+ ethernetInterfaceDetailsFragment.getPreferenceScreenResId(),
+ R.xml.ethernet_interface_details,
+ )
+ }
+
+ @Test
+ fun getLogTag_shouldReturnClassName() {
+ assertEquals(
+ ethernetInterfaceDetailsFragment.getLogTag(),
+ "EthernetInterfaceDetailsFragment",
+ )
+ }
+
+ @Test
+ fun createPreferenceController_shouldReturnDetailController() {
+ val preferenceController =
+ ethernetInterfaceDetailsFragment.createPreferenceControllers(context)
+ assertEquals(1, preferenceController.size)
+ assertTrue(preferenceController[0] is AbstractPreferenceController)
+ }
+}