Merge "Show Hotspot informations in Network details settings" into main

This commit is contained in:
Weng Su
2023-08-29 03:55:12 +00:00
committed by Android (Google) Code Review
10 changed files with 721 additions and 45 deletions

View File

@@ -16,7 +16,19 @@
package com.android.settings.wifi.details;
import static android.net.wifi.sharedconnectivity.app.HotspotNetwork.NETWORK_TYPE_CELLULAR;
import static android.net.wifi.sharedconnectivity.app.HotspotNetwork.NETWORK_TYPE_ETHERNET;
import static android.net.wifi.sharedconnectivity.app.HotspotNetwork.NETWORK_TYPE_UNKNOWN;
import static android.net.wifi.sharedconnectivity.app.HotspotNetwork.NETWORK_TYPE_WIFI;
import static android.telephony.SignalStrength.SIGNAL_STRENGTH_GREAT;
import static com.android.settings.wifi.WifiSettings.WIFI_DIALOG_ID;
import static com.android.settings.wifi.details.WifiNetworkDetailsFragment.KEY_HOTSPOT_CONNECTION_CATEGORY;
import static com.android.settings.wifi.details.WifiNetworkDetailsFragment.KEY_HOTSPOT_DEVICE_BATTERY;
import static com.android.settings.wifi.details.WifiNetworkDetailsFragment.KEY_HOTSPOT_DEVICE_CATEGORY;
import static com.android.settings.wifi.details.WifiNetworkDetailsFragment.KEY_HOTSPOT_DEVICE_INTERNET_SOURCE;
import static com.android.settingslib.Utils.formatPercentage;
import static com.android.wifitrackerlib.WifiEntry.WIFI_LEVEL_MAX;
import static com.google.common.truth.Truth.assertThat;
@@ -29,25 +41,37 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;
import androidx.preference.Preference;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.wifi.WifiUtils;
import com.android.settings.wifi.details2.WifiDetailPreferenceController2;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.graph.ThemedBatteryDrawable;
import com.android.wifitrackerlib.NetworkDetailsTracker;
import com.android.wifitrackerlib.WifiEntry;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
@@ -56,23 +80,63 @@ import java.util.ArrayList;
@RunWith(RobolectricTestRunner.class)
public class WifiNetworkDetailsFragmentTest {
private static final String TEST_PREFERENCE_KEY = "TEST_PREFERENCE_KEY";
static final String TEST_PREFERENCE_KEY = "TEST_PREFERENCE_KEY";
static final int BATTERY_PERCENTAGE_MAX = 100;
@Rule
public final MockitoRule mMockitoRule = MockitoJUnit.rule();
@Spy
Context mContext = ApplicationProvider.getApplicationContext();
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
PreferenceManager mPreferenceManager;
@Mock
Preference mHotspotDeviceCategory;
@Mock
Preference mInternetSource;
@Mock
Preference mBattery;
@Mock
Preference mHotspotConnectionCategory;
@Mock
Menu mMenu;
@Mock
Drawable mDrawable;
@Mock
WifiDetailPreferenceController2 mWifiDetailPreferenceController2;
@Mock
WifiEntry mWifiEntry;
@Mock
NetworkDetailsTracker mNetworkDetailsTracker;
@Mock
Menu mMenu;
private WifiNetworkDetailsFragment mFragment;
WifiNetworkDetailsViewModel.HotspotNetworkData mHotspotNetworkData;
FakeFragment mFragment;
PreferenceScreen mScreen;
ArgumentCaptor<ThemedBatteryDrawable> mThemedBatteryDrawableCaptor =
ArgumentCaptor.forClass(ThemedBatteryDrawable.class);
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
doReturn(mWifiEntry).when(mNetworkDetailsTracker).getWifiEntry();
doReturn(true).when(mWifiEntry).isSaved();
doReturn(NETWORK_TYPE_WIFI).when(mHotspotNetworkData).getNetworkType();
doReturn(WIFI_LEVEL_MAX).when(mHotspotNetworkData).getUpstreamConnectionStrength();
doReturn(BATTERY_PERCENTAGE_MAX).when(mHotspotNetworkData).getBatteryPercentage();
doReturn(true).when(mHotspotNetworkData).isBatteryCharging();
mFragment = new WifiNetworkDetailsFragment();
mFragment = spy(new FakeFragment());
doReturn(mPreferenceManager).when(mFragment).getPreferenceManager();
doReturn(mContext).when(mPreferenceManager).getContext();
doReturn(mContext).when(mFragment).getContext();
mScreen = spy(new PreferenceScreen(mContext, /* attrs= */ null));
doReturn(mPreferenceManager).when(mScreen).getPreferenceManager();
doReturn(mScreen).when(mFragment).getPreferenceScreen();
doReturn(mHotspotDeviceCategory).when(mScreen).findPreference(KEY_HOTSPOT_DEVICE_CATEGORY);
doReturn(mInternetSource).when(mScreen).findPreference(KEY_HOTSPOT_DEVICE_INTERNET_SOURCE);
doReturn(mBattery).when(mScreen).findPreference(KEY_HOTSPOT_DEVICE_BATTERY);
doReturn(mHotspotConnectionCategory).when(mScreen)
.findPreference(KEY_HOTSPOT_CONNECTION_CATEGORY);
mFragment.mNetworkDetailsTracker = mNetworkDetailsTracker;
}
@@ -94,7 +158,7 @@ public class WifiNetworkDetailsFragmentTest {
@Test
public void onCreateOptionsMenu_shouldSetCorrectIcon() {
final MenuItem menuItem = mock(MenuItem.class);
MenuItem menuItem = mock(MenuItem.class);
doReturn(menuItem).when(mMenu).add(anyInt(), eq(Menu.FIRST), anyInt(), anyInt());
mFragment.onCreateOptionsMenu(mMenu, mock(MenuInflater.class));
@@ -122,47 +186,129 @@ public class WifiNetworkDetailsFragmentTest {
@Test
public void restrictUi_shouldShowRestrictedText() {
final FakeFragment fragment = spy(new FakeFragment());
final PreferenceScreen screen = mock(PreferenceScreen.class);
final TextView restrictedText = mock(TextView.class);
doReturn(screen).when(fragment).getPreferenceScreen();
doReturn(false).when(fragment).isUiRestrictedByOnlyAdmin();
doReturn(restrictedText).when(fragment).getEmptyTextView();
TextView restrictedText = mock(TextView.class);
doReturn(mScreen).when(mFragment).getPreferenceScreen();
doReturn(false).when(mFragment).isUiRestrictedByOnlyAdmin();
doReturn(restrictedText).when(mFragment).getEmptyTextView();
fragment.restrictUi();
mFragment.restrictUi();
verify(restrictedText).setText(anyInt());
}
@Test
public void restrictUi_shouldRemoveAllPreferences() {
final FakeFragment fragment = spy(new FakeFragment());
final PreferenceScreen screen = mock(PreferenceScreen.class);
doReturn(screen).when(fragment).getPreferenceScreen();
doReturn(true).when(fragment).isUiRestrictedByOnlyAdmin();
doReturn(mScreen).when(mFragment).getPreferenceScreen();
doReturn(true).when(mFragment).isUiRestrictedByOnlyAdmin();
fragment.restrictUi();
mFragment.restrictUi();
verify(screen).removeAll();
verify(mScreen).removeAll();
}
@Test
public void refreshPreferences_controllerShouldUpdateStateAndDisplayPreference() {
final FakeFragment fragment = spy(new FakeFragment());
final PreferenceScreen screen = mock(PreferenceScreen.class);
final Preference preference = mock(Preference.class);
final TestController controller = mock(TestController.class);
doReturn(screen).when(fragment).getPreferenceScreen();
doReturn(preference).when(screen).findPreference(TEST_PREFERENCE_KEY);
Preference preference = mock(Preference.class);
TestController controller = mock(TestController.class);
doReturn(mScreen).when(mFragment).getPreferenceScreen();
doReturn(preference).when(mScreen).findPreference(TEST_PREFERENCE_KEY);
doReturn(TEST_PREFERENCE_KEY).when(controller).getPreferenceKey();
fragment.mControllers = new ArrayList<>();
fragment.mControllers.add(controller);
fragment.addPreferenceController(controller);
mFragment.mControllers = new ArrayList<>();
mFragment.mControllers.add(controller);
mFragment.addPreferenceController(controller);
fragment.refreshPreferences();
mFragment.refreshPreferences();
verify(controller).updateState(preference);
verify(controller).displayPreference(screen);
verify(controller).displayPreference(mScreen);
}
@Test
public void onHotspotNetworkChanged_dataNull_hotspotSetVisibleFalse() {
mFragment.mWifiDetailPreferenceController2 = mWifiDetailPreferenceController2;
mFragment.onHotspotNetworkChanged(null);
verify(mHotspotDeviceCategory).setVisible(false);
verify(mHotspotConnectionCategory).setVisible(false);
verify(mWifiDetailPreferenceController2).setSignalStrengthTitle(R.string.wifi_signal);
}
@Test
public void onHotspotNetworkChanged_dataNotNull_hotspotSetVisibleTrue() {
mFragment.mWifiDetailPreferenceController2 = mWifiDetailPreferenceController2;
mFragment.onHotspotNetworkChanged(mHotspotNetworkData);
verify(mHotspotDeviceCategory).setVisible(true);
verify(mFragment).updateInternetSource(mHotspotNetworkData.getNetworkType(),
mHotspotNetworkData.getUpstreamConnectionStrength());
verify(mFragment).updateBattery(mHotspotNetworkData.isBatteryCharging(),
mHotspotNetworkData.getBatteryPercentage());
verify(mHotspotConnectionCategory).setVisible(true);
verify(mWifiDetailPreferenceController2)
.setSignalStrengthTitle(R.string.hotspot_connection_strength);
}
@Test
public void updateInternetSource_networkTypeWifi_setWifiResource() {
doReturn(mDrawable).when(mContext)
.getDrawable(WifiUtils.getInternetIconResource(WIFI_LEVEL_MAX, false));
mFragment.updateInternetSource(NETWORK_TYPE_WIFI, WIFI_LEVEL_MAX);
verify(mInternetSource).setSummary(R.string.internet_source_wifi);
verify(mInternetSource).setIcon(mDrawable);
}
@Test
public void updateInternetSource_networkTypeMobileData_setMobileDataResource() {
doReturn(mDrawable).when(mFragment).getMobileDataIcon(SIGNAL_STRENGTH_GREAT);
mFragment.updateInternetSource(NETWORK_TYPE_CELLULAR, SIGNAL_STRENGTH_GREAT);
verify(mInternetSource).setSummary(R.string.internet_source_mobile_data);
verify(mInternetSource).setIcon(mDrawable);
}
@Test
public void updateInternetSource_networkTypeEthernet_setEthernetResource() {
doReturn(mDrawable).when(mContext).getDrawable(R.drawable.ic_settings_ethernet);
mFragment.updateInternetSource(NETWORK_TYPE_ETHERNET, 0 /* don't care */);
verify(mInternetSource).setSummary(R.string.internet_source_ethernet);
verify(mInternetSource).setIcon(mDrawable);
}
@Test
public void updateInternetSource_networkTypeUnknown_setPlaceholderResource() {
mFragment.updateInternetSource(NETWORK_TYPE_UNKNOWN, 0 /* don't care */);
verify(mInternetSource).setSummary(R.string.summary_placeholder);
verify(mInternetSource).setIcon(null);
}
@Test
public void updateBattery_hiPercentageNoCharging_setResourceCorrect() {
mFragment.updateBattery(false /* isChanging */, BATTERY_PERCENTAGE_MAX);
verify(mBattery).setSummary(formatPercentage(BATTERY_PERCENTAGE_MAX));
verify(mBattery).setIcon(mThemedBatteryDrawableCaptor.capture());
ThemedBatteryDrawable drawable = mThemedBatteryDrawableCaptor.getValue();
assertThat(drawable.getCharging()).isFalse();
assertThat(drawable.getBatteryLevel()).isEqualTo(BATTERY_PERCENTAGE_MAX);
}
@Test
public void updateBattery_lowPercentageWithCharging_setResourceCorrect() {
mFragment.updateBattery(true /* isChanging */, 0 /* percentage */);
verify(mBattery).setSummary(formatPercentage(0));
verify(mBattery).setIcon(mThemedBatteryDrawableCaptor.capture());
ThemedBatteryDrawable drawable = mThemedBatteryDrawableCaptor.getValue();
assertThat(drawable.getCharging()).isTrue();
assertThat(drawable.getBatteryLevel()).isEqualTo(0);
}
// Fake WifiNetworkDetailsFragment to override the protected method as public.

View File

@@ -15,8 +15,13 @@
*/
package com.android.settings.wifi.details2;
import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_PHONE;
import static com.android.settingslib.wifi.WifiUtils.getHotspotIconResource;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyBoolean;
import static org.mockito.Mockito.anyInt;
@@ -83,6 +88,7 @@ import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.utils.StringUtil;
import com.android.settingslib.widget.ActionButtonsPreference;
import com.android.settingslib.widget.LayoutPreference;
import com.android.wifitrackerlib.HotspotNetworkEntry;
import com.android.wifitrackerlib.NetworkDetailsTracker;
import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiEntry.ConnectCallback;
@@ -524,12 +530,12 @@ public class WifiDetailPreferenceController2Test {
}
@Test
public void entityHeader_shouldNotHaveIconSetForNotInRangeNetwork() {
public void entityHeader_shouldHaveIconSetForNotInRangeNetwork() {
setUpForNotInRangeNetwork();
displayAndResume();
verify(mMockHeaderController, never()).setIcon(any(Drawable.class));
verify(mMockHeaderController).setIcon(any(Drawable.class));
}
@Test
@@ -1814,6 +1820,71 @@ public class WifiDetailPreferenceController2Test {
assertThat(info.getDisplayName().toString()).isEqualTo("sim2");
}
@Test
public void refreshEntryHeaderIcon_entityHeaderControllerNull_doNothing() {
setUpSpyController();
mController.mEntityHeaderController = null;
mController.refreshEntryHeaderIcon();
verify(mController, never()).getWifiDrawable(any());
}
@Test
public void refreshEntryHeaderIcon_entityHeaderControllerNotNull_setIcon() {
setUpSpyController();
mController.mEntityHeaderController = mMockHeaderController;
mController.refreshEntryHeaderIcon();
verify(mController).getWifiDrawable(any());
verify(mMockHeaderController).setIcon(any(Drawable.class));
}
@Test
public void getWifiDrawable_withHotspotNetworkEntry_returnHotspotDrawable() {
setUpSpyController();
HotspotNetworkEntry entry = mock(HotspotNetworkEntry.class);
when(entry.getDeviceType()).thenReturn(DEVICE_TYPE_PHONE);
mController.getWifiDrawable(entry);
verify(mContext).getDrawable(getHotspotIconResource(DEVICE_TYPE_PHONE));
}
@Test
public void getWifiDrawable_withWifiEntryNotShowXLevelIcon_getIconWithInternet() {
setUpSpyController();
when(mMockWifiEntry.getLevel()).thenReturn(WifiEntry.WIFI_LEVEL_MAX);
when(mMockWifiEntry.shouldShowXLevelIcon()).thenReturn(false);
mController.getWifiDrawable(mMockWifiEntry);
verify(mMockIconInjector).getIcon(eq(false) /* noInternet */, anyInt());
}
@Test
public void getWifiDrawable_withWifiEntryShowXLevelIcon_getIconWithNoInternet() {
setUpSpyController();
when(mMockWifiEntry.getLevel()).thenReturn(WifiEntry.WIFI_LEVEL_MAX);
when(mMockWifiEntry.shouldShowXLevelIcon()).thenReturn(true);
mController.getWifiDrawable(mMockWifiEntry);
verify(mMockIconInjector).getIcon(eq(true) /* noInternet */, anyInt());
verify(mMockIconInjector).getIcon(eq(true) /* noInternet */, anyInt());
}
@Test
public void setSignalStrengthTitle_prefNotNull_setPrefTitle() {
setUpSpyController();
mController.displayPreference(mMockScreen);
mController.setSignalStrengthTitle(R.string.hotspot_connection_strength);
verify(mMockSignalStrengthPref).setTitle(R.string.hotspot_connection_strength);
}
private SubscriptionInfo mockSubscriptionInfo(int subId, String displayName, int carrierId) {
SubscriptionInfo info = mock(SubscriptionInfo.class);
when(info.getSubscriptionId()).thenReturn(subId);