diff --git a/res/values/strings.xml b/res/values/strings.xml index fb80f293fb5..8d200f6ea4f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -12554,6 +12554,8 @@ Airplane mode networks available To switch networks, disconnect ethernet + + Cannot switch networks while connected diff --git a/res/xml/network_provider_settings.xml b/res/xml/network_provider_settings.xml index 17546a56210..67fc73d8974 100644 --- a/res/xml/network_provider_settings.xml +++ b/res/xml/network_provider_settings.xml @@ -36,6 +36,12 @@ android:layout="@layout/view_airplane_mode_networks_button" settings:allowDividerBelow="true"/> + + diff --git a/src/com/android/settings/network/ConnectedEthernetNetworkController.java b/src/com/android/settings/network/ConnectedEthernetNetworkController.java new file mode 100644 index 00000000000..5918331ceb0 --- /dev/null +++ b/src/com/android/settings/network/ConnectedEthernetNetworkController.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2021 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; + +import static com.android.settings.network.InternetUpdater.INTERNET_ETHERNET; + +import android.content.Context; +import android.graphics.drawable.Drawable; + +import androidx.lifecycle.Lifecycle; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +import com.android.settings.R; +import com.android.settingslib.Utils; +import com.android.settingslib.core.AbstractPreferenceController; + +/** + * PreferenceController to show the connected ethernet network. + */ +public class ConnectedEthernetNetworkController extends AbstractPreferenceController + implements InternetUpdater.OnInternetTypeChangedListener { + + public static final String KEY = "connected_ethernet_network"; + + private Preference mPreference; + private InternetUpdater mInternetUpdater; + private @InternetUpdater.InternetType int mInternetType; + + public ConnectedEthernetNetworkController(Context context, Lifecycle lifecycle) { + super(context); + mInternetUpdater = new InternetUpdater(context, lifecycle, this); + mInternetType = mInternetUpdater.getInternetType(); + } + + @Override + public boolean isAvailable() { + return mInternetType == INTERNET_ETHERNET; + } + + @Override + public String getPreferenceKey() { + return KEY; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(KEY); + final Drawable drawable = mContext.getDrawable(R.drawable.ic_settings_ethernet); + if (drawable != null) { + drawable.setTintList( + Utils.getColorAttr(mContext, android.R.attr.colorControlActivated)); + mPreference.setIcon(drawable); + } + } + + /** + * Called when internet type is changed. + * + * @param internetType the internet type + */ + public void onInternetTypeChanged(@InternetUpdater.InternetType int internetType) { + mInternetType = internetType; + if (mPreference != null) { + mPreference.setVisible(isAvailable()); + } + } +} diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java index 44468338006..ae9b2d889c0 100644 --- a/src/com/android/settings/network/NetworkProviderSettings.java +++ b/src/com/android/settings/network/NetworkProviderSettings.java @@ -207,6 +207,8 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment mViewAirplaneModeNetworksButtonPreference; @VisibleForTesting LayoutPreference mResetInternetPreference; + @VisibleForTesting + ConnectedEthernetNetworkController mConnectedEthernetNetworkController; /** * Mobile networks list for provider model @@ -267,6 +269,7 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment } addNetworkMobileProviderController(); addViewAirplaneModeNetworksButtonController(); + addConnectedEthernetNetworkController(); } private void addNetworkMobileProviderController() { @@ -287,6 +290,14 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment mViewAirplaneModeNetworksButtonPreference.displayPreference(getPreferenceScreen()); } + private void addConnectedEthernetNetworkController() { + if (mConnectedEthernetNetworkController == null) { + mConnectedEthernetNetworkController = + new ConnectedEthernetNetworkController(getContext(), getSettingsLifecycle()); + } + mConnectedEthernetNetworkController.displayPreference(getPreferenceScreen()); + } + @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); diff --git a/tests/unit/src/com/android/settings/network/ConnectedEthernetNetworkControllerTest.java b/tests/unit/src/com/android/settings/network/ConnectedEthernetNetworkControllerTest.java new file mode 100644 index 00000000000..b5acdc5f584 --- /dev/null +++ b/tests/unit/src/com/android/settings/network/ConnectedEthernetNetworkControllerTest.java @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2021 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; + +import static com.android.settings.network.InternetUpdater.INTERNET_APM; +import static com.android.settings.network.InternetUpdater.INTERNET_APM_NETWORKS; +import static com.android.settings.network.InternetUpdater.INTERNET_CELLULAR; +import static com.android.settings.network.InternetUpdater.INTERNET_ETHERNET; +import static com.android.settings.network.InternetUpdater.INTERNET_WIFI; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.wifi.WifiManager; +import android.os.Looper; + +import androidx.lifecycle.Lifecycle; +import androidx.preference.Preference; +import androidx.preference.PreferenceManager; +import androidx.preference.PreferenceScreen; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +@RunWith(AndroidJUnit4.class) +public class ConnectedEthernetNetworkControllerTest { + + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + + private Context mContext; + private ConnectedEthernetNetworkController mController; + private PreferenceScreen mScreen; + private Preference mPreference; + + @Before + public void setUp() { + mContext = spy(ApplicationProvider.getApplicationContext()); + when(mContext.getSystemService(ConnectivityManager.class)).thenReturn( + mock(ConnectivityManager.class)); + when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mock(WifiManager.class)); + + mController = new ConnectedEthernetNetworkController(mContext, mock(Lifecycle.class)); + if (Looper.myLooper() == null) { + Looper.prepare(); + } + final PreferenceManager preferenceManager = new PreferenceManager(mContext); + mScreen = preferenceManager.createPreferenceScreen(mContext); + mPreference = new Preference(mContext); + mPreference.setKey(ConnectedEthernetNetworkController.KEY); + mScreen.addPreference(mPreference); + } + + @Test + public void isAvailable_internetApm_shouldBeFalse() { + mController.onInternetTypeChanged(INTERNET_APM); + + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + public void isAvailable_internetApmNetworks_shouldBeFalse() { + mController.onInternetTypeChanged(INTERNET_APM_NETWORKS); + + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + public void isAvailable_internetWifi_shouldBeFalse() { + mController.onInternetTypeChanged(INTERNET_WIFI); + + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + public void isAvailable_internetCellular_shouldBeFalse() { + mController.onInternetTypeChanged(INTERNET_CELLULAR); + + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + public void isAvailable_internetEthernet_shouldBeTrue() { + mController.onInternetTypeChanged(INTERNET_ETHERNET); + + assertThat(mController.isAvailable()).isTrue(); + } + + @Test + public void isVisible_internetWifiToEthernet_shouldBeFalseThenTrue() { + mController.displayPreference(mScreen); + mController.onInternetTypeChanged(INTERNET_WIFI); + + assertThat(mPreference.isVisible()).isFalse(); + + mController.onInternetTypeChanged(INTERNET_ETHERNET); + + assertThat(mPreference.isVisible()).isTrue(); + } + + @Test + public void isVisible_internetEthernetToCellular_shouldBeTrueThenFalse() { + mController.displayPreference(mScreen); + mController.onInternetTypeChanged(INTERNET_ETHERNET); + + assertThat(mPreference.isVisible()).isTrue(); + + mController.onInternetTypeChanged(INTERNET_CELLULAR); + + assertThat(mPreference.isVisible()).isFalse(); + } +}