[Provider Model] Add WiFi toggle in internet panel

- Move Wi-Fi toggle from menu button to slice row

- Remove Wi-Fi disconnect action

- Show scanning sub-title once only

Bug: 189912933
Test: manual test
atest -c InternetConnectivityPanelTest \
         ProviderModelSliceTest

Change-Id: I2baf05362f5cd0a8ce94c7b3b2b112a7e9fe6894
This commit is contained in:
Weng Su
2021-06-08 04:43:24 +08:00
parent 9f7564c1b6
commit 04a4060225
5 changed files with 191 additions and 207 deletions

View File

@@ -20,6 +20,7 @@ package com.android.settings.network;
import static android.app.slice.Slice.EXTRA_TOGGLE_STATE; import static android.app.slice.Slice.EXTRA_TOGGLE_STATE;
import static com.android.settings.slices.CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI; import static com.android.settings.slices.CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI;
import static com.android.settings.slices.CustomSliceRegistry.WIFI_SLICE_URI;
import android.annotation.ColorInt; import android.annotation.ColorInt;
import android.app.PendingIntent; import android.app.PendingIntent;
@@ -64,7 +65,6 @@ import java.util.stream.Collectors;
public class ProviderModelSlice extends WifiSlice { public class ProviderModelSlice extends WifiSlice {
private static final String TAG = "ProviderModelSlice"; private static final String TAG = "ProviderModelSlice";
protected static final String ACTION_TITLE_CONNECT_TO_CARRIER = "Connect_To_Carrier";
private final ProviderModelSliceHelper mHelper; private final ProviderModelSliceHelper mHelper;
@@ -89,78 +89,77 @@ public class ProviderModelSlice extends WifiSlice {
@Override @Override
public Slice getSlice() { public Slice getSlice() {
// The provider model slice step: // The provider model slice step:
// First section: Add a Wi-Fi item which state is connected. // First section: Add the Ethernet item.
// Second section: Add a carrier item. // Second section: Add the carrier item.
// Third section: Add the Wi-Fi items which are not connected. // Third section: Add the Wi-Fi toggle item.
// Fourth section: If device has connection problem, this row show the message for user. // Fourth section: Add the connected Wi-Fi item.
@InternetUpdater.InternetType int internetType = getInternetType(); // Fifth section: Add the Wi-Fi items which are not connected.
// Sixth section: Add the See All item.
final ListBuilder listBuilder = mHelper.createListBuilder(getUri()); final ListBuilder listBuilder = mHelper.createListBuilder(getUri());
if (mHelper.isAirplaneModeEnabled() && !mWifiManager.isWifiEnabled()
&& internetType != InternetUpdater.INTERNET_ETHERNET) {
log("Airplane mode is enabled.");
return listBuilder.build();
}
int maxListSize = 0; int maxListSize = 0;
List<WifiSliceItem> wifiList = null;
final NetworkProviderWorker worker = getWorker(); final NetworkProviderWorker worker = getWorker();
if (worker != null) { if (worker != null) {
// get Wi-Fi list.
wifiList = worker.getResults();
maxListSize = worker.getApRowCount(); maxListSize = worker.getApRowCount();
} else { } else {
log("network provider worker is null."); log("network provider worker is null.");
} }
final boolean hasCarrier = mHelper.hasCarrier(); // First section: Add the Ethernet item.
log("hasCarrier: " + hasCarrier); if (getInternetType() == InternetUpdater.INTERNET_ETHERNET) {
// First section: Add a Ethernet or Wi-Fi item which state is connected.
boolean isConnectedWifiAddedTop = false;
final WifiSliceItem connectedWifiItem = mHelper.getConnectedWifiItem(wifiList);
if (internetType == InternetUpdater.INTERNET_ETHERNET) {
log("get Ethernet item which is connected"); log("get Ethernet item which is connected");
listBuilder.addRow(createEthernetRow()); listBuilder.addRow(createEthernetRow());
maxListSize--; maxListSize--;
} else { }
if (connectedWifiItem != null && internetType == InternetUpdater.INTERNET_WIFI) {
log("get Wi-Fi item which is connected to internet"); // Second section: Add the carrier item.
listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem)); if (!mHelper.isAirplaneModeEnabled()) {
isConnectedWifiAddedTop = true; final boolean hasCarrier = mHelper.hasCarrier();
log("hasCarrier: " + hasCarrier);
if (hasCarrier) {
mHelper.updateTelephony();
listBuilder.addRow(
mHelper.createCarrierRow(
worker != null ? worker.getNetworkTypeDescription() : ""));
maxListSize--; maxListSize--;
} }
} }
// Second section: Add a carrier item. // Third section: Add the Wi-Fi toggle item.
if (hasCarrier) { final boolean isWifiEnabled = mWifiManager.isWifiEnabled();
mHelper.updateTelephony(); listBuilder.addRow(createWifiToggleRow(mContext, isWifiEnabled));
listBuilder.addRow( maxListSize--;
mHelper.createCarrierRow( if (!isWifiEnabled) {
worker != null ? worker.getNetworkTypeDescription() : "")); log("Wi-Fi is disabled");
maxListSize--; return listBuilder.build();
}
List<WifiSliceItem> wifiList = (worker != null) ? worker.getResults() : null;
if (wifiList == null || wifiList.size() <= 0) {
log("Wi-Fi list is empty");
return listBuilder.build();
} }
// Third section: Add the connected Wi-Fi item to Wi-Fi list if the Ethernet is connected. // Fourth section: Add the connected Wi-Fi item.
if (connectedWifiItem != null && !isConnectedWifiAddedTop) { final WifiSliceItem connectedWifiItem = mHelper.getConnectedWifiItem(wifiList);
if (connectedWifiItem != null) {
log("get Wi-Fi item which is connected"); log("get Wi-Fi item which is connected");
listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem)); listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem));
maxListSize--; maxListSize--;
} }
// Fourth section: Add the Wi-Fi items which are not connected. // Fifth section: Add the Wi-Fi items which are not connected.
if (wifiList != null && wifiList.size() > 0) { log("get Wi-Fi items which are not connected. Wi-Fi items : " + wifiList.size());
log("get Wi-Fi items which are not connected. Wi-Fi items : " + wifiList.size()); final List<WifiSliceItem> disconnectedWifiList = wifiList.stream()
.filter(item -> item.getConnectedState() != WifiEntry.CONNECTED_STATE_CONNECTED)
final List<WifiSliceItem> disconnectedWifiList = wifiList.stream() .limit(maxListSize - 1)
.filter(wifiSliceItem -> wifiSliceItem.getConnectedState() .collect(Collectors.toList());
!= WifiEntry.CONNECTED_STATE_CONNECTED) for (WifiSliceItem item : disconnectedWifiList) {
.limit(maxListSize - 1) listBuilder.addRow(getWifiSliceItemRow(item));
.collect(Collectors.toList());
for (WifiSliceItem item : disconnectedWifiList) {
listBuilder.addRow(getWifiSliceItemRow(item));
}
listBuilder.addRow(getSeeAllRow());
} }
// Sixth section: Add the See All item.
log("add See-All");
listBuilder.addRow(getSeeAllRow());
return listBuilder.build(); return listBuilder.build();
} }
@@ -269,6 +268,26 @@ public class ProviderModelSlice extends WifiSlice {
.setSubtitle(mContext.getText(R.string.to_switch_networks_disconnect_ethernet)); .setSubtitle(mContext.getText(R.string.to_switch_networks_disconnect_ethernet));
} }
/**
* @return a {@link ListBuilder.RowBuilder} of the Wi-Fi toggle.
*/
protected ListBuilder.RowBuilder createWifiToggleRow(Context context, boolean isWifiEnabled) {
final Intent intent = new Intent(WIFI_SLICE_URI.toString())
.setData(WIFI_SLICE_URI)
.setClass(context, SliceBroadcastReceiver.class)
.putExtra(EXTRA_TOGGLE_STATE, !isWifiEnabled)
// The FLAG_RECEIVER_FOREGROUND flag is necessary to avoid the intent delay of
// the first sending after the device restarts
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
final SliceAction toggleSliceAction = SliceAction.createToggle(pendingIntent,
null /* actionTitle */, isWifiEnabled);
return new ListBuilder.RowBuilder()
.setTitle(context.getString(R.string.wifi_settings))
.setPrimaryAction(toggleSliceAction);
}
protected ListBuilder.RowBuilder getSeeAllRow() { protected ListBuilder.RowBuilder getSeeAllRow() {
final CharSequence title = mContext.getText(R.string.previous_connected_see_all); final CharSequence title = mContext.getText(R.string.previous_connected_see_all);
final IconCompat icon = getSeeAllIcon(); final IconCompat icon = getSeeAllIcon();
@@ -294,31 +313,6 @@ public class ProviderModelSlice extends WifiSlice {
return SliceAction.createDeeplink(intent, icon, ListBuilder.ICON_IMAGE, title); return SliceAction.createDeeplink(intent, icon, ListBuilder.ICON_IMAGE, title);
} }
@Override
protected ListBuilder.RowBuilder getWifiSliceItemRow(WifiSliceItem wifiSliceItem) {
final CharSequence title = wifiSliceItem.getTitle();
final IconCompat levelIcon = getWifiSliceItemLevelIcon(wifiSliceItem);
final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder()
.setTitleItem(levelIcon, ListBuilder.ICON_IMAGE)
.setTitle(title)
.setSubtitle(wifiSliceItem.getSummary())
.setContentDescription(wifiSliceItem.getContentDescription());
final IconCompat endIcon;
if (wifiSliceItem.hasInternetAccess()) {
rowBuilder.setPrimaryAction(SliceAction.create(getBroadcastIntent(mContext),
levelIcon, ListBuilder.ICON_IMAGE, ACTION_TITLE_CONNECT_TO_CARRIER));
endIcon = IconCompat.createWithResource(mContext, R.drawable.ic_settings_close);
} else {
rowBuilder.setPrimaryAction(getWifiEntryAction(wifiSliceItem, levelIcon, title));
endIcon = getEndIcon(wifiSliceItem);
}
if (endIcon != null) {
rowBuilder.addEndItem(endIcon, ListBuilder.ICON_IMAGE);
}
return rowBuilder;
}
@Override @Override
protected IconCompat getWifiSliceItemLevelIcon(WifiSliceItem wifiSliceItem) { protected IconCompat getWifiSliceItemLevelIcon(WifiSliceItem wifiSliceItem) {
if (wifiSliceItem.getConnectedState() == WifiEntry.CONNECTED_STATE_CONNECTED if (wifiSliceItem.getConnectedState() == WifiEntry.CONNECTED_STATE_CONNECTED

View File

@@ -54,7 +54,7 @@ public class NetworkProviderWorker extends WifiScanWorker implements
DataConnectivityListener.Client, InternetUpdater.InternetChangeListener, DataConnectivityListener.Client, InternetUpdater.InternetChangeListener,
SubscriptionsChangeListener.SubscriptionsChangeListenerClient { SubscriptionsChangeListener.SubscriptionsChangeListenerClient {
private static final String TAG = "NetworkProviderWorker"; private static final String TAG = "NetworkProviderWorker";
private static final int PROVIDER_MODEL_DEFAULT_EXPANDED_ROW_COUNT = 5; private static final int PROVIDER_MODEL_DEFAULT_EXPANDED_ROW_COUNT = 6;
private DataContentObserver mMobileDataObserver; private DataContentObserver mMobileDataObserver;
private SignalStrengthListener mSignalStrengthListener; private SignalStrengthListener mSignalStrengthListener;
private SubscriptionsChangeListener mSubscriptionsListener; private SubscriptionsChangeListener mSubscriptionsListener;

View File

@@ -38,7 +38,6 @@ import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent; import androidx.lifecycle.OnLifecycleEvent;
@@ -84,12 +83,13 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
} }
if (TextUtils.equals(intent.getAction(), WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { if (TextUtils.equals(intent.getAction(), WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
showProgressBar(); updateProgressBar();
updatePanelTitle(); updatePanelTitle();
return; return;
} }
if (TextUtils.equals(intent.getAction(), WifiManager.NETWORK_STATE_CHANGED_ACTION)) { if (TextUtils.equals(intent.getAction(), WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
updateProgressBar();
updatePanelTitle(); updatePanelTitle();
} }
} }
@@ -110,13 +110,40 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
private int mDefaultDataSubid = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private int mDefaultDataSubid = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
// Wi-Fi scanning progress bar // Wi-Fi scanning progress bar
protected HandlerInjector mHandlerInjector;
protected boolean mIsProgressBarVisible; protected boolean mIsProgressBarVisible;
protected final Runnable mHideProgressBarRunnable = () -> { protected boolean mIsScanningSubTitleShownOnce;
protected Runnable mHideProgressBarRunnable = () -> {
setProgressBarVisible(false); setProgressBarVisible(false);
}; };
protected Runnable mHideScanningSubTitleRunnable = () -> {
mIsScanningSubTitleShownOnce = true;
updatePanelTitle();
};
/**
* Wrapper for testing compatibility.
*/
@VisibleForTesting
static class HandlerInjector {
protected final Handler mHandler;
HandlerInjector(Context context) {
mHandler = context.getMainThreadHandler();
}
public void postDelay(Runnable runnable) {
mHandler.postDelayed(runnable, 2000 /* delay millis */);
}
public void removeCallbacks(Runnable runnable) {
mHandler.removeCallbacks(runnable);
}
}
private InternetConnectivityPanel(Context context) { private InternetConnectivityPanel(Context context) {
mContext = context.getApplicationContext(); mContext = context.getApplicationContext();
mHandlerInjector = new HandlerInjector(context);
mIsProviderModelEnabled = Utils.isProviderModelEnabled(mContext); mIsProviderModelEnabled = Utils.isProviderModelEnabled(mContext);
mInternetUpdater = new InternetUpdater(context, null /* Lifecycle */, this); mInternetUpdater = new InternetUpdater(context, null /* Lifecycle */, this);
@@ -150,7 +177,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
mTelephonyManager.registerTelephonyCallback( mTelephonyManager.registerTelephonyCallback(
new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback); new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback);
mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter); mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter);
showProgressBar(); updateProgressBar();
updatePanelTitle(); updatePanelTitle();
} }
@@ -165,7 +192,8 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
mConnectivityListener.stop(); mConnectivityListener.stop();
mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback); mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback);
mContext.unregisterReceiver(mWifiStateReceiver); mContext.unregisterReceiver(mWifiStateReceiver);
mContext.getMainThreadHandler().removeCallbacks(mHideProgressBarRunnable); mHandlerInjector.removeCallbacks(mHideProgressBarRunnable);
mHandlerInjector.removeCallbacks(mHideScanningSubTitleRunnable);
} }
/** /**
@@ -209,23 +237,6 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
return null; return null;
} }
@Override
public boolean isCustomizedButtonUsed() {
return mIsProviderModelEnabled;
}
@Override
public CharSequence getCustomizedButtonTitle() {
return mContext.getText(
mInternetUpdater.isWifiEnabled() ? R.string.turn_off_wifi : R.string.turn_on_wifi);
}
@Override
public void onClickCustomizedButton(FragmentActivity panelActivity) {
// Don't finish the panel activity
mWifiManager.setWifiEnabled(!mInternetUpdater.isWifiEnabled());
}
@Override @Override
public boolean isProgressBarVisible() { public boolean isProgressBarVisible() {
return mIsProgressBarVisible; return mIsProgressBarVisible;
@@ -246,6 +257,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
*/ */
@Override @Override
public void onAirplaneModeChanged(boolean isAirplaneModeOn) { public void onAirplaneModeChanged(boolean isAirplaneModeOn) {
log("onAirplaneModeChanged: isAirplaneModeOn:" + isAirplaneModeOn);
updatePanelTitle(); updatePanelTitle();
} }
@@ -254,6 +266,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
*/ */
@Override @Override
public void onWifiEnabledChanged(boolean enabled) { public void onWifiEnabledChanged(boolean enabled) {
log("onWifiEnabledChanged: enabled:" + enabled);
updatePanelTitle(); updatePanelTitle();
} }
@@ -305,13 +318,6 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
return; return;
} }
if (mIsProgressBarVisible) {
// When the Wi-Fi scan result callback is received
// Sub-Title: Searching for networks...
mSubtitle = SUBTITLE_TEXT_SEARCHING_FOR_NETWORKS;
return;
}
if (mInternetUpdater.isAirplaneModeOn()) { if (mInternetUpdater.isAirplaneModeOn()) {
return; return;
} }
@@ -319,11 +325,18 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
final List<ScanResult> wifiList = mWifiManager.getScanResults(); final List<ScanResult> wifiList = mWifiManager.getScanResults();
if (wifiList != null && wifiList.size() != 0) { if (wifiList != null && wifiList.size() != 0) {
// When the Wi-Fi scan result is not empty // When the Wi-Fi scan result is not empty
// Sub-Title: Select the network you want to use for data // Sub-Title: Tap a network to connect
mSubtitle = SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT; mSubtitle = SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT;
return; return;
} }
if (!mIsScanningSubTitleShownOnce && mIsProgressBarVisible) {
// When the Wi-Fi scan result callback is received
// Sub-Title: Searching for networks...
mSubtitle = SUBTITLE_TEXT_SEARCHING_FOR_NETWORKS;
return;
}
// Sub-Title: // Sub-Title:
// show non_carrier_network_unavailable // show non_carrier_network_unavailable
// - while Wi-Fi on + no Wi-Fi item // - while Wi-Fi on + no Wi-Fi item
@@ -353,7 +366,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
mSubtitle = SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE; mSubtitle = SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE;
} }
protected void showProgressBar() { protected void updateProgressBar() {
if (mWifiManager == null || !mInternetUpdater.isWifiEnabled()) { if (mWifiManager == null || !mInternetUpdater.isWifiEnabled()) {
setProgressBarVisible(false); setProgressBarVisible(false);
return; return;
@@ -362,8 +375,9 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve
setProgressBarVisible(true); setProgressBarVisible(true);
List<ScanResult> wifiScanResults = mWifiManager.getScanResults(); List<ScanResult> wifiScanResults = mWifiManager.getScanResults();
if (wifiScanResults != null && wifiScanResults.size() > 0) { if (wifiScanResults != null && wifiScanResults.size() > 0) {
mContext.getMainThreadHandler().postDelayed(mHideProgressBarRunnable, mHandlerInjector.postDelay(mHideProgressBarRunnable);
2000 /* delay millis */); } else if (!mIsScanningSubTitleShownOnce) {
mHandlerInjector.postDelay(mHideScanningSubTitleRunnable);
} }
} }

View File

@@ -16,8 +16,6 @@
package com.android.settings.network; package com.android.settings.network;
import static com.android.settings.network.ProviderModelSlice.ACTION_TITLE_CONNECT_TO_CARRIER;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
@@ -42,6 +40,8 @@ import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import androidx.slice.Slice; import androidx.slice.Slice;
import androidx.slice.SliceItem;
import androidx.slice.SliceMetadata;
import androidx.slice.SliceProvider; import androidx.slice.SliceProvider;
import androidx.slice.builders.ListBuilder; import androidx.slice.builders.ListBuilder;
import androidx.slice.builders.SliceAction; import androidx.slice.builders.SliceAction;
@@ -100,8 +100,6 @@ public class ProviderModelSliceTest {
ListBuilder.RowBuilder mMockCarrierRowBuild; ListBuilder.RowBuilder mMockCarrierRowBuild;
@Mock @Mock
WifiPickerTracker mWifiPickerTracker; WifiPickerTracker mWifiPickerTracker;
@Mock
WifiSliceItem mWifiSliceItem;
private FakeFeatureFactory mFeatureFactory; private FakeFeatureFactory mFeatureFactory;
@@ -122,7 +120,7 @@ public class ProviderModelSliceTest {
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager); when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager); when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
when(mWifiManager.isWifiEnabled()).thenReturn(true);
// Set-up specs for SliceMetadata. // Set-up specs for SliceMetadata.
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
@@ -182,7 +180,24 @@ public class ProviderModelSliceTest {
@Test @Test
@UiThreadTest @UiThreadTest
public void getSlice_haveTwoWifiAndOneCarrier_getCarrierAndTwoWiFiAndSeeAll() { public void getSlice_airplaneModeIsOn_oneWifiToggle() {
mWifiList.clear();
mMockNetworkProviderWorker.updateSelfResults(null);
mockHelperCondition(true, false, false, null);
final Slice slice = mMockProviderModelSlice.getSlice();
assertThat(slice).isNotNull();
verify(mListBuilder, times(1)).addRow(any(ListBuilder.RowBuilder.class));
final SliceItem sliceTitle =
SliceMetadata.from(mContext, slice).getListContent().getHeader().getTitleItem();
assertThat(sliceTitle.getText()).isEqualTo(
ResourcesUtils.getResourcesString(mContext, "wifi_settings"));
}
@Test
@UiThreadTest
public void getSlice_haveTwoWifiAndOneCarrier_getFiveRow() {
mWifiList.clear(); mWifiList.clear();
mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1", mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true); WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true);
@@ -197,13 +212,13 @@ public class ProviderModelSliceTest {
assertThat(slice).isNotNull(); assertThat(slice).isNotNull();
verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild); verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild);
verify(mListBuilder, times(4)).addRow(any(ListBuilder.RowBuilder.class)); verify(mListBuilder, times(5)).addRow(any(ListBuilder.RowBuilder.class));
assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue(); assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue();
} }
@Test @Test
@UiThreadTest @UiThreadTest
public void getSlice_haveOneConnectedWifiAndTwoDisconnectedWifiAndNoCarrier_getFourRow() { public void getSlice_haveOneConnectedWifiAndTwoDisconnectedWifiAndNoCarrier_getFiveRow() {
mWifiList.clear(); mWifiList.clear();
mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1", mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true); WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true);
@@ -220,13 +235,13 @@ public class ProviderModelSliceTest {
final Slice slice = mMockProviderModelSlice.getSlice(); final Slice slice = mMockProviderModelSlice.getSlice();
assertThat(slice).isNotNull(); assertThat(slice).isNotNull();
verify(mListBuilder, times(4)).addRow(any(ListBuilder.RowBuilder.class)); verify(mListBuilder, times(5)).addRow(any(ListBuilder.RowBuilder.class));
assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue(); assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue();
} }
@Test @Test
@UiThreadTest @UiThreadTest
public void getSlice_haveTwoDisconnectedWifiAndNoCarrier_getThreeRow() { public void getSlice_haveTwoDisconnectedWifiAndNoCarrier_getFourRow() {
mWifiList.clear(); mWifiList.clear();
mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1", mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi1_key", true); WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi1_key", true);
@@ -240,13 +255,13 @@ public class ProviderModelSliceTest {
final Slice slice = mMockProviderModelSlice.getSlice(); final Slice slice = mMockProviderModelSlice.getSlice();
assertThat(slice).isNotNull(); assertThat(slice).isNotNull();
verify(mListBuilder, times(3)).addRow(any(ListBuilder.RowBuilder.class)); verify(mListBuilder, times(4)).addRow(any(ListBuilder.RowBuilder.class));
assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue(); assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue();
} }
@Test @Test
@UiThreadTest @UiThreadTest
public void getSlice_haveEthernetAndCarrierAndTwoDisconnectedWifi_getFiveRow() { public void getSlice_haveEthernetAndCarrierAndTwoDisconnectedWifi_getSixRow() {
mWifiList.clear(); mWifiList.clear();
mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1", mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi1_key", true); WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi1_key", true);
@@ -264,13 +279,13 @@ public class ProviderModelSliceTest {
assertThat(slice).isNotNull(); assertThat(slice).isNotNull();
assertThat(mMockProviderModelSlice.hasCreateEthernetRow()).isTrue(); assertThat(mMockProviderModelSlice.hasCreateEthernetRow()).isTrue();
verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild); verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild);
verify(mListBuilder, times(5)).addRow(any(ListBuilder.RowBuilder.class)); verify(mListBuilder, times(6)).addRow(any(ListBuilder.RowBuilder.class));
assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue(); assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue();
} }
@Test @Test
@UiThreadTest @UiThreadTest
public void getSlice_haveEthernetAndCarrierAndConnectedWifiAndDisconnectedWifi_getFiveRow() { public void getSlice_haveEthernetAndCarrierAndConnectedWifiAndDisconnectedWifi_getSixRow() {
mWifiList.clear(); mWifiList.clear();
mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1", mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true); WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true);
@@ -288,7 +303,7 @@ public class ProviderModelSliceTest {
assertThat(slice).isNotNull(); assertThat(slice).isNotNull();
assertThat(mMockProviderModelSlice.hasCreateEthernetRow()).isTrue(); assertThat(mMockProviderModelSlice.hasCreateEthernetRow()).isTrue();
verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild); verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild);
verify(mListBuilder, times(5)).addRow(any(ListBuilder.RowBuilder.class)); verify(mListBuilder, times(6)).addRow(any(ListBuilder.RowBuilder.class));
assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue(); assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue();
} }
@@ -380,6 +395,11 @@ public class ProviderModelSliceTest {
return super.getSeeAllRow(); return super.getSeeAllRow();
} }
@Override
public ListBuilder.RowBuilder getWifiSliceItemRow(WifiSliceItem wifiSliceItem) {
return super.getWifiSliceItemRow(wifiSliceItem);
}
public boolean hasCreateEthernetRow() { public boolean hasCreateEthernetRow() {
return mHasCreateEthernetRow; return mHasCreateEthernetRow;
} }
@@ -420,29 +440,4 @@ public class ProviderModelSliceTest {
verify(mMockNetworkProviderWorker, never()).connectCarrierNetwork(); verify(mMockNetworkProviderWorker, never()).connectCarrierNetwork();
} }
@Test
public void getWifiSliceItemRow_wifiNoInternetAccess_actionConnectToWifiSsid() {
when(mWifiSliceItem.getKey()).thenReturn("wifi_key");
when(mWifiSliceItem.getTitle()).thenReturn("wifi_ssid");
when(mWifiSliceItem.hasInternetAccess()).thenReturn(false);
ListBuilder.RowBuilder rowBuilder =
mMockProviderModelSlice.getWifiSliceItemRow(mWifiSliceItem);
assertThat(rowBuilder.getPrimaryAction().getTitle())
.isEqualTo("wifi_ssid");
}
@Test
public void getWifiSliceItemRow_wifiHasInternetAccess_actionConnectToCarrier() {
when(mWifiSliceItem.getTitle()).thenReturn("wifi_ssid");
when(mWifiSliceItem.hasInternetAccess()).thenReturn(true);
ListBuilder.RowBuilder rowBuilder =
mMockProviderModelSlice.getWifiSliceItemRow(mWifiSliceItem);
assertThat(rowBuilder.getPrimaryAction().getTitle())
.isEqualTo(ACTION_TITLE_CONNECT_TO_CARRIER);
}
} }

View File

@@ -18,12 +18,9 @@ package com.android.settings.panel;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -32,9 +29,7 @@ import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.net.wifi.ScanResult; import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.Handler;
import androidx.fragment.app.FragmentActivity;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -82,8 +77,6 @@ public class InternetConnectivityPanelTest {
@Rule @Rule
public final MockitoRule mMocks = MockitoJUnit.rule(); public final MockitoRule mMocks = MockitoJUnit.rule();
@Mock @Mock
Handler mMainThreadHandler;
@Mock
PanelContentCallback mPanelContentCallback; PanelContentCallback mPanelContentCallback;
@Mock @Mock
InternetUpdater mInternetUpdater; InternetUpdater mInternetUpdater;
@@ -91,17 +84,34 @@ public class InternetConnectivityPanelTest {
private WifiManager mWifiManager; private WifiManager mWifiManager;
@Mock @Mock
private ProviderModelSliceHelper mProviderModelSliceHelper; private ProviderModelSliceHelper mProviderModelSliceHelper;
@Mock
private FragmentActivity mPanelActivity;
private Context mContext; private Context mContext;
private FakeHandlerInjector mFakeHandlerInjector;
private InternetConnectivityPanel mPanel; private InternetConnectivityPanel mPanel;
private class FakeHandlerInjector extends InternetConnectivityPanel.HandlerInjector {
private Runnable mRunnable;
FakeHandlerInjector(Context context) {
super(context);
}
@Override
public void postDelay(Runnable runnable) {
mRunnable = runnable;
}
public Runnable getRunnable() {
return mRunnable;
}
}
@Before @Before
public void setUp() { public void setUp() {
mContext = spy(ApplicationProvider.getApplicationContext()); mContext = spy(ApplicationProvider.getApplicationContext());
mFakeHandlerInjector = new FakeHandlerInjector(mContext);
when(mContext.getApplicationContext()).thenReturn(mContext); when(mContext.getApplicationContext()).thenReturn(mContext);
when(mContext.getMainThreadHandler()).thenReturn(mMainThreadHandler);
when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager); when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
mPanel = InternetConnectivityPanel.create(mContext); mPanel = InternetConnectivityPanel.create(mContext);
@@ -109,6 +119,7 @@ public class InternetConnectivityPanelTest {
mPanel.mIsProviderModelEnabled = true; mPanel.mIsProviderModelEnabled = true;
mPanel.mInternetUpdater = mInternetUpdater; mPanel.mInternetUpdater = mInternetUpdater;
mPanel.mProviderModelSliceHelper = mProviderModelSliceHelper; mPanel.mProviderModelSliceHelper = mProviderModelSliceHelper;
mPanel.mHandlerInjector = mFakeHandlerInjector;
} }
@Test @Test
@@ -203,20 +214,6 @@ public class InternetConnectivityPanelTest {
assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT); assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT);
} }
@Test
public void getCustomizedButtonTitle_wifiOff_turnOnWifi() {
doReturn(false).when(mInternetUpdater).isWifiEnabled();
assertThat(mPanel.getCustomizedButtonTitle()).isEqualTo(BUTTON_TURN_ON_WIFI);
}
@Test
public void getCustomizedButtonTitle_wifiOn_turnOffWifi() {
doReturn(true).when(mInternetUpdater).isWifiEnabled();
assertThat(mPanel.getCustomizedButtonTitle()).isEqualTo(BUTTON_TURN_OFF_WIFI);
}
@Test @Test
public void getSlices_providerModelDisabled_containsNecessarySlices() { public void getSlices_providerModelDisabled_containsNecessarySlices() {
mPanel.mIsProviderModelEnabled = false; mPanel.mIsProviderModelEnabled = false;
@@ -240,31 +237,6 @@ public class InternetConnectivityPanelTest {
assertThat(mPanel.getSeeMoreIntent()).isNull(); assertThat(mPanel.getSeeMoreIntent()).isNull();
} }
@Test
public void onClickCustomizedButton_wifiOn_setWifiOff() {
doReturn(true).when(mInternetUpdater).isWifiEnabled();
mPanel.onClickCustomizedButton(mPanelActivity);
verify(mWifiManager).setWifiEnabled(false);
}
@Test
public void onClickCustomizedButton_wifiOff_setWifiOn() {
doReturn(false).when(mInternetUpdater).isWifiEnabled();
mPanel.onClickCustomizedButton(mPanelActivity);
verify(mWifiManager).setWifiEnabled(true);
}
@Test
public void onClickCustomizedButton_shouldNotFinishActivity() {
mPanel.onClickCustomizedButton(mPanelActivity);
verify(mPanelActivity, never()).finish();
}
@Test @Test
public void updatePanelTitle_onHeaderChanged() { public void updatePanelTitle_onHeaderChanged() {
clearInvocations(mPanelContentCallback); clearInvocations(mPanelContentCallback);
@@ -295,36 +267,41 @@ public class InternetConnectivityPanelTest {
} }
@Test @Test
public void showProgressBar_wifiDisabled_hideProgress() { public void updateProgressBar_wifiDisabled_hideProgress() {
mPanel.mIsProgressBarVisible = true; mPanel.mIsProgressBarVisible = true;
doReturn(false).when(mInternetUpdater).isWifiEnabled(); doReturn(false).when(mInternetUpdater).isWifiEnabled();
clearInvocations(mPanelContentCallback); clearInvocations(mPanelContentCallback);
mPanel.showProgressBar(); mPanel.updateProgressBar();
assertThat(mPanel.isProgressBarVisible()).isFalse(); assertThat(mPanel.isProgressBarVisible()).isFalse();
verify(mPanelContentCallback).onProgressBarVisibleChanged(); verify(mPanelContentCallback).onProgressBarVisibleChanged();
} }
@Test @Test
public void showProgressBar_noWifiScanResults_showProgressForever() { public void updateProgressBar_noWifiScanResults_showProgressForever() {
mPanel.mIsScanningSubTitleShownOnce = false;
mPanel.mIsProgressBarVisible = false; mPanel.mIsProgressBarVisible = false;
doReturn(true).when(mInternetUpdater).isWifiEnabled(); doReturn(true).when(mInternetUpdater).isWifiEnabled();
List<ScanResult> noWifiScanResults = new ArrayList<>(); List<ScanResult> noWifiScanResults = new ArrayList<>();
doReturn(noWifiScanResults).when(mWifiManager).getScanResults(); doReturn(noWifiScanResults).when(mWifiManager).getScanResults();
clearInvocations(mPanelContentCallback); clearInvocations(mPanelContentCallback);
mPanel.showProgressBar(); mPanel.updateProgressBar();
assertThat(mPanel.isProgressBarVisible()).isTrue(); assertThat(mPanel.mIsProgressBarVisible).isTrue();
verify(mPanelContentCallback).onProgressBarVisibleChanged(); verify(mPanelContentCallback).onProgressBarVisibleChanged();
verify(mPanelContentCallback).onHeaderChanged(); verify(mPanelContentCallback).onHeaderChanged();
verify(mMainThreadHandler, never())
.postDelayed(any() /* mHideProgressBarRunnable */, anyLong()); assertThat(mFakeHandlerInjector.getRunnable())
.isEqualTo(mPanel.mHideScanningSubTitleRunnable);
mFakeHandlerInjector.getRunnable().run();
assertThat(mPanel.mIsScanningSubTitleShownOnce).isTrue();
assertThat(mPanel.mIsProgressBarVisible).isTrue();
} }
@Test @Test
public void showProgressBar_hasWifiScanResults_showProgressDelayedHide() { public void updateProgressBar_hasWifiScanResults_showProgressDelayedHide() {
mPanel.mIsProgressBarVisible = false; mPanel.mIsProgressBarVisible = false;
doReturn(true).when(mInternetUpdater).isWifiEnabled(); doReturn(true).when(mInternetUpdater).isWifiEnabled();
List<ScanResult> hasWifiScanResults = mock(ArrayList.class); List<ScanResult> hasWifiScanResults = mock(ArrayList.class);
@@ -332,11 +309,15 @@ public class InternetConnectivityPanelTest {
doReturn(hasWifiScanResults).when(mWifiManager).getScanResults(); doReturn(hasWifiScanResults).when(mWifiManager).getScanResults();
clearInvocations(mPanelContentCallback); clearInvocations(mPanelContentCallback);
mPanel.showProgressBar(); mPanel.updateProgressBar();
assertThat(mPanel.isProgressBarVisible()).isTrue(); assertThat(mPanel.isProgressBarVisible()).isTrue();
verify(mPanelContentCallback).onProgressBarVisibleChanged(); verify(mPanelContentCallback).onProgressBarVisibleChanged();
verify(mMainThreadHandler).postDelayed(any() /* mHideProgressBarRunnable */, anyLong());
assertThat(mFakeHandlerInjector.getRunnable())
.isEqualTo(mPanel.mHideProgressBarRunnable);
mFakeHandlerInjector.getRunnable().run();
assertThat(mPanel.mIsProgressBarVisible).isFalse();
} }
@Test @Test