Merge "Show Hotspot informations in Network details settings" into main
This commit is contained in:
@@ -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.
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user