diff --git a/src/com/android/settings/network/ProviderModelSlice.java b/src/com/android/settings/network/ProviderModelSlice.java index a1fdb1cebf4..18765a8e2fe 100644 --- a/src/com/android/settings/network/ProviderModelSlice.java +++ b/src/com/android/settings/network/ProviderModelSlice.java @@ -147,31 +147,6 @@ public class ProviderModelSlice extends WifiSlice { listBuilder.addRow(getWifiSliceItemRow(item)); } } - - // Fifth section: If device has connection problem, this row show the message for user. - // 1) show non_carrier_network_unavailable: - // - while no wifi item - // 2) show all_network_unavailable: - // - while no wifi item + no carrier - // - while no wifi item + no data capability - if (worker == null || wifiList == null || wifiList.size() == 0) { - log("no wifi item"); - int resId = R.string.non_carrier_network_unavailable; - if (!hasCarrier || !mHelper.isDataSimActive()) { - log("No carrier item or no carrier data."); - resId = R.string.all_network_unavailable; - } - - if (!hasCarrier && !hasEthernet) { - // If there is no item in ProviderModelItem, slice needs a header. - listBuilder.setHeader(mHelper.createHeader( - NetworkProviderSettings.ACTION_NETWORK_PROVIDER_SETTINGS)); - } - listBuilder.addGridRow( - mHelper.createMessageGridRow(resId, - NetworkProviderSettings.ACTION_NETWORK_PROVIDER_SETTINGS)); - } - return listBuilder.build(); } diff --git a/src/com/android/settings/network/ProviderModelSliceHelper.java b/src/com/android/settings/network/ProviderModelSliceHelper.java index 8ae4197c9fa..440d425fe26 100644 --- a/src/com/android/settings/network/ProviderModelSliceHelper.java +++ b/src/com/android/settings/network/ProviderModelSliceHelper.java @@ -36,7 +36,6 @@ import android.util.Log; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.core.graphics.drawable.IconCompat; -import androidx.slice.builders.GridRowBuilder; import androidx.slice.builders.ListBuilder; import androidx.slice.builders.SliceAction; @@ -79,12 +78,6 @@ public class ProviderModelSliceHelper { Log.d(TAG, s); } - protected ListBuilder.HeaderBuilder createHeader(String intentAction) { - return new ListBuilder.HeaderBuilder() - .setTitle(mContext.getText(R.string.summary_placeholder)) - .setPrimaryAction(getPrimarySliceAction(intentAction)); - } - protected ListBuilder createListBuilder(Uri uri) { final ListBuilder builder = new ListBuilder(mContext, uri, ListBuilder.INFINITY) .setAccentColor(-1) @@ -92,14 +85,6 @@ public class ProviderModelSliceHelper { return builder; } - protected GridRowBuilder createMessageGridRow(int messageResId, String intentAction) { - final CharSequence title = mContext.getText(messageResId); - return new GridRowBuilder() - // Add cells to the grid row. - .addCell(new GridRowBuilder.CellBuilder().addTitleText(title)) - .setPrimaryAction(getPrimarySliceAction(intentAction)); - } - @Nullable protected WifiSliceItem getConnectedWifiItem(List wifiList) { if (wifiList == null) { @@ -111,7 +96,10 @@ public class ProviderModelSliceHelper { return item.isPresent() ? item.get() : null; } - protected boolean hasCarrier() { + /** + * @return whether there is the carrier item in the slice. + */ + public boolean hasCarrier() { if (isAirplaneModeEnabled() || mSubscriptionManager == null || mTelephonyManager == null || mSubscriptionManager.getDefaultDataSubscriptionId() @@ -175,7 +163,12 @@ public class ProviderModelSliceHelper { return mTelephonyManager.isDataEnabled(); } - protected boolean isDataSimActive() { + /** + * To check the carrier data status. + * + * @return whether the carrier data is active. + */ + public boolean isDataSimActive() { return isNoCarrierData() ? false : MobileNetworkUtils.activeNetworkIsCellular(mContext); } @@ -193,11 +186,6 @@ public class ProviderModelSliceHelper { return mobileDataOnAndNoData || mobileDataOffAndOutOfService; } - private boolean isAirplaneSafeNetworksModeEnabled() { - // TODO: isAirplaneSafeNetworksModeEnabled is not READY - return false; - } - @VisibleForTesting Drawable getMobileDrawable(Drawable drawable) throws Throwable { // set color and drawable diff --git a/src/com/android/settings/panel/InternetConnectivityPanel.java b/src/com/android/settings/panel/InternetConnectivityPanel.java index 4fda0a4f0c3..238cbb4ed97 100644 --- a/src/com/android/settings/panel/InternetConnectivityPanel.java +++ b/src/com/android/settings/panel/InternetConnectivityPanel.java @@ -22,10 +22,23 @@ import static androidx.lifecycle.Lifecycle.Event.ON_RESUME; import static com.android.settings.network.NetworkProviderSettings.ACTION_NETWORK_PROVIDER_SETTINGS; import android.app.settings.SettingsEnums; +import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.net.Uri; +import android.net.wifi.ScanResult; +import android.net.wifi.WifiManager; +import android.os.Handler; +import android.os.HandlerExecutor; +import android.os.Looper; import android.provider.Settings; +import android.telephony.ServiceState; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyCallback; +import android.telephony.TelephonyManager; +import android.text.TextUtils; +import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.LifecycleObserver; @@ -35,6 +48,9 @@ import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.network.AirplaneModePreferenceController; import com.android.settings.network.InternetUpdater; +import com.android.settings.network.ProviderModelSliceHelper; +import com.android.settings.network.SubscriptionsChangeListener; +import com.android.settings.network.telephony.DataConnectivityListener; import com.android.settings.slices.CustomSliceRegistry; import java.util.ArrayList; @@ -44,23 +60,69 @@ import java.util.List; * Represents the Internet Connectivity Panel. */ public class InternetConnectivityPanel implements PanelContent, LifecycleObserver, - InternetUpdater.InternetChangeListener { + InternetUpdater.InternetChangeListener, DataConnectivityListener.Client, + SubscriptionsChangeListener.SubscriptionsChangeListenerClient { + private static final String TAG = "InternetConnectivityPanel"; + private static final int SUBTITLE_TEXT_NONE = -1; + private static final int SUBTITLE_TEXT_WIFI_IS_TURNED_ON = R.string.wifi_is_turned_on_subtitle; + private static final int SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE = + R.string.non_carrier_network_unavailable; + private static final int SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE = + R.string.all_network_unavailable; private final Context mContext; + private final WifiManager mWifiManager; + private final IntentFilter mWifiStateFilter; + private final NetworkProviderTelephonyCallback mTelephonyCallback; + private final BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent == null) { + return; + } + if (TextUtils.equals(intent.getAction(), WifiManager.NETWORK_STATE_CHANGED_ACTION) + || TextUtils.equals(intent.getAction(), + WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { + updatePanelTitle(); + } + } + }; + @VisibleForTesting boolean mIsProviderModelEnabled; - private PanelContentCallback mCallback; @VisibleForTesting InternetUpdater mInternetUpdater; + @VisibleForTesting + ProviderModelSliceHelper mProviderModelSliceHelper; - public static InternetConnectivityPanel create(Context context) { - return new InternetConnectivityPanel(context); - } + private int mSubtitle = SUBTITLE_TEXT_NONE; + private PanelContentCallback mCallback; + private TelephonyManager mTelephonyManager; + private SubscriptionsChangeListener mSubscriptionsListener; + private DataConnectivityListener mConnectivityListener; + private int mDefaultDataSubid = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private InternetConnectivityPanel(Context context) { mContext = context.getApplicationContext(); mIsProviderModelEnabled = Utils.isProviderModelEnabled(mContext); mInternetUpdater = new InternetUpdater(context, null /* Lifecycle */, this); + + mSubscriptionsListener = new SubscriptionsChangeListener(context, this); + mConnectivityListener = new DataConnectivityListener(context, this); + mTelephonyCallback = new NetworkProviderTelephonyCallback(); + mDefaultDataSubid = getDefaultDataSubscriptionId(); + mTelephonyManager = mContext.getSystemService(TelephonyManager.class); + + mWifiManager = mContext.getSystemService(WifiManager.class); + mWifiStateFilter = new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION); + mWifiStateFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); + + mProviderModelSliceHelper = new ProviderModelSliceHelper(mContext, null); + } + + /** create the panel */ + public static InternetConnectivityPanel create(Context context) { + return new InternetConnectivityPanel(context); } /** @OnLifecycleEvent(ON_RESUME) */ @@ -70,6 +132,12 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve return; } mInternetUpdater.onResume(); + mSubscriptionsListener.start(); + mConnectivityListener.start(); + mTelephonyManager.registerTelephonyCallback( + new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback); + mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter); + updatePanelTitle(); } /** @OnLifecycleEvent(ON_PAUSE) */ @@ -79,6 +147,10 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve return; } mInternetUpdater.onPause(); + mSubscriptionsListener.stop(); + mConnectivityListener.stop(); + mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback); + mContext.unregisterReceiver(mWifiStateReceiver); } /** @@ -98,9 +170,8 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve */ @Override public CharSequence getSubTitle() { - if (mIsProviderModelEnabled && mInternetUpdater.isAirplaneModeOn() - && mInternetUpdater.isWifiEnabled()) { - return mContext.getText(R.string.wifi_is_turned_on_subtitle); + if (mIsProviderModelEnabled && mSubtitle != SUBTITLE_TEXT_NONE) { + return mContext.getText(mSubtitle); } return null; } @@ -170,15 +241,36 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve updatePanelTitle(); } - private void updatePanelTitle() { + @Override + public void onSubscriptionsChanged() { + final int defaultDataSubId = getDefaultDataSubscriptionId(); + log("onSubscriptionsChanged: defaultDataSubId:" + defaultDataSubId); + if (mDefaultDataSubid == defaultDataSubId) { + return; + } + if (SubscriptionManager.isUsableSubscriptionId(defaultDataSubId)) { + mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback); + mTelephonyManager.registerTelephonyCallback( + new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback); + } + updatePanelTitle(); + } + + @Override + public void onDataConnectivityChange() { + log("onDataConnectivityChange"); + updatePanelTitle(); + } + + @VisibleForTesting + void updatePanelTitle() { if (mCallback == null) { return; } + updateSubtitleText(); - if (mInternetUpdater.isAirplaneModeOn() && mInternetUpdater.isWifiEnabled()) { - // When the airplane mode is on and Wi-Fi is enabled. - // Title: Airplane mode - // Sub-Title: Wi-Fi is turned on + log("Subtitle:" + mSubtitle); + if (mSubtitle != SUBTITLE_TEXT_NONE) { mCallback.onHeaderChanged(); } else { // Other situations. @@ -187,4 +279,63 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve } mCallback.onCustomizedButtonStateChanged(); } + + @VisibleForTesting + int getDefaultDataSubscriptionId() { + return SubscriptionManager.getDefaultDataSubscriptionId(); + } + + private void updateSubtitleText() { + mSubtitle = SUBTITLE_TEXT_NONE; + if (!mInternetUpdater.isWifiEnabled()) { + return; + } + + if (mInternetUpdater.isAirplaneModeOn()) { + // When the airplane mode is on and Wi-Fi is enabled. + // Title: Airplane mode + // Sub-Title: Wi-Fi is turned on + log("Airplane mode is on + Wi-Fi on."); + mSubtitle = SUBTITLE_TEXT_WIFI_IS_TURNED_ON; + return; + } + + final List wifiList = mWifiManager.getScanResults(); + if (wifiList != null && wifiList.size() == 0) { + // Sub-Title: + // show non_carrier_network_unavailable + // - while Wi-Fi on + no Wi-Fi item + // show all_network_unavailable: + // - while Wi-Fi on + no Wi-Fi item + no carrier + // - while Wi-Fi on + no Wi-Fi item + no data capability + log("No Wi-Fi item."); + mSubtitle = SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE; + if (!mProviderModelSliceHelper.hasCarrier() + || !mProviderModelSliceHelper.isDataSimActive()) { + log("No carrier item or no carrier data."); + mSubtitle = SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE; + } + } + } + + private class NetworkProviderTelephonyCallback extends TelephonyCallback implements + TelephonyCallback.DataConnectionStateListener, + TelephonyCallback.ServiceStateListener { + @Override + public void onServiceStateChanged(ServiceState state) { + log("onServiceStateChanged voiceState=" + state.getState() + + " dataState=" + state.getDataRegistrationState()); + updatePanelTitle(); + } + + @Override + public void onDataConnectionStateChanged(int state, int networkType) { + log("onDataConnectionStateChanged: networkType=" + networkType + " state=" + state); + updatePanelTitle(); + } + } + + private static void log(String s) { + Log.d(TAG, s); + } } diff --git a/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java b/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java index d205607db23..ac2e24d8061 100644 --- a/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java +++ b/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java @@ -34,7 +34,6 @@ import android.net.Network; import android.net.NetworkCapabilities; import android.net.Uri; import android.os.PersistableBundle; -import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; @@ -43,8 +42,6 @@ import android.telephony.TelephonyManager; import android.text.Html; import androidx.slice.Slice; -import androidx.slice.builders.GridRowBuilder; -import androidx.slice.builders.GridRowBuilder.CellBuilder; import androidx.slice.builders.ListBuilder; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -114,20 +111,6 @@ public class ProviderModelSliceHelperTest { mProviderModelSliceHelper = new MockProviderModelSliceHelper(mContext, testCustomSliceable); } - @Test - public void createMessageGridRow_inputTheResourceId_verifyTitle() { - int messageResId = ResourcesUtils.getResourcesId(mContext, "string", - "non_carrier_network_unavailable"); - CharSequence title = ResourcesUtils.getResourcesString(mContext, - "non_carrier_network_unavailable"); - - GridRowBuilder testGridRow = mProviderModelSliceHelper.createMessageGridRow(messageResId, - Settings.ACTION_AIRPLANE_MODE_SETTINGS); - List cellItem = testGridRow.getCells(); - - assertThat(cellItem.get(0).getTitle()).isEqualTo(title); - } - @Test public void getConnectedWifiItem_inputListInvolveOneConnectedWifiItem_verifyReturnItem() { when(mWifiSliceItem1.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED); diff --git a/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java b/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java index 705f60ec972..4760daacef8 100644 --- a/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java +++ b/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java @@ -22,7 +22,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; @@ -42,7 +41,6 @@ import android.telephony.TelephonyManager; import androidx.slice.Slice; import androidx.slice.SliceProvider; -import androidx.slice.builders.GridRowBuilder; import androidx.slice.builders.ListBuilder; import androidx.slice.builders.SliceAction; import androidx.slice.widget.SliceLiveData; @@ -97,12 +95,6 @@ public class ProviderModelSliceTest { private WifiSliceItem mMockWifiSliceItem3; @Mock ListBuilder.RowBuilder mMockCarrierRowBuild; - @Mock - ListBuilder.HeaderBuilder mMockHeader; - @Mock - GridRowBuilder mMockGridRowBuilderNonCarrierNetworkUnavailable; - @Mock - GridRowBuilder mMockGridRowBuilderAllNetworkUnavailable; private FakeFeatureFactory mFeatureFactory; @Mock @@ -147,35 +139,7 @@ public class ProviderModelSliceTest { @Test @UiThreadTest - public void getSlice_noWorkerAndNoCarrier_getOneHeaderOneGridRowWithAllNetworkUnavailable() { - mWifiList.clear(); - mMockProviderModelSlice = new MockProviderModelSlice(mContext, null); - mockHelperCondition(false, false, false, null); - - final Slice slice = mMockProviderModelSlice.getSlice(); - - assertThat(slice).isNotNull(); - verify(mListBuilder, times(1)).setHeader(mMockHeader); - verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable); - } - - @Test - @UiThreadTest - public void getSlice_noWifiAndNoCarrier_getOneHeaderOneGridRowWithAllNetworkUnavailable() { - mWifiList.clear(); - mMockNetworkProviderWorker.updateSelfResults(null); - mockHelperCondition(false, false, false, null); - - final Slice slice = mMockProviderModelSlice.getSlice(); - - assertThat(slice).isNotNull(); - verify(mListBuilder, times(1)).setHeader(mMockHeader); - verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable); - } - - @Test - @UiThreadTest - public void getSlice_noWifiAndHasCarrierNoData_oneCarrierOneGridRowWithAllNetworkUnavailable() { + public void getSlice_noWifiAndHasCarrierNoData_oneCarrier() { mWifiList.clear(); mMockNetworkProviderWorker.updateSelfResults(null); mockHelperCondition(false, true, false, null); @@ -184,12 +148,11 @@ public class ProviderModelSliceTest { assertThat(slice).isNotNull(); verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild); - verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable); } @Test @UiThreadTest - public void getSlice_noWifiAndNoCarrier_oneCarrierOneGridRowWithNonCarrierNetworkUnavailable() { + public void getSlice_noWifiAndNoCarrier_oneCarrier() { mWifiList.clear(); mMockProviderModelSlice = new MockProviderModelSlice(mContext, null); mockHelperCondition(false, true, true, null); @@ -198,7 +161,6 @@ public class ProviderModelSliceTest { assertThat(slice).isNotNull(); verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild); - verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderNonCarrierNetworkUnavailable); } @Test @@ -331,19 +293,6 @@ public class ProviderModelSliceTest { private void mockBuilder() { SliceAction mockSliceAction = getPrimarySliceAction(); - when(mMockHeader.getTitle()).thenReturn("mockHeader"); - when(mMockHeader.getPrimaryAction()).thenReturn(mockSliceAction); - when(mProviderModelSliceHelper.createHeader(anyString())).thenReturn(mMockHeader); - - int resId = ResourcesUtils.getResourcesId(mContext, "string", - "non_carrier_network_unavailable"); - when(mProviderModelSliceHelper.createMessageGridRow(eq(resId), anyString())).thenReturn( - mMockGridRowBuilderNonCarrierNetworkUnavailable); - resId = ResourcesUtils.getResourcesId(mContext, "string", - "all_network_unavailable"); - when(mProviderModelSliceHelper.createMessageGridRow(eq(resId), anyString())).thenReturn( - mMockGridRowBuilderAllNetworkUnavailable); - when(mMockCarrierRowBuild.getTitle()).thenReturn("mockRow"); when(mMockCarrierRowBuild.getPrimaryAction()).thenReturn(mockSliceAction); when(mProviderModelSliceHelper.createCarrierRow(anyString())).thenReturn( diff --git a/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java b/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java index ba5ee8e3263..8f0cfb31538 100644 --- a/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java +++ b/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java @@ -22,15 +22,19 @@ import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.content.Context; import android.net.Uri; +import android.net.wifi.ScanResult; +import android.net.wifi.WifiManager; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.settings.network.AirplaneModePreferenceController; import com.android.settings.network.InternetUpdater; +import com.android.settings.network.ProviderModelSliceHelper; import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.testutils.ResourcesUtils; @@ -42,6 +46,7 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; +import java.util.ArrayList; import java.util.List; @RunWith(AndroidJUnit4.class) @@ -55,6 +60,12 @@ public class InternetConnectivityPanelTest { ApplicationProvider.getApplicationContext(), "wifi_is_turned_on_subtitle"); public static final String BUTTON_SETTINGS = ResourcesUtils.getResourcesString( ApplicationProvider.getApplicationContext(), "settings_button"); + public static final String SUBTITLE_NON_CARRIER_NETWORK_UNAVAILABLE = + ResourcesUtils.getResourcesString(ApplicationProvider.getApplicationContext(), + "non_carrier_network_unavailable"); + public static final String SUBTITLE_ALL_NETWORK_UNAVAILABLE = + ResourcesUtils.getResourcesString(ApplicationProvider.getApplicationContext(), + "all_network_unavailable"); @Rule public final MockitoRule mMocks = MockitoJUnit.rule(); @@ -62,6 +73,10 @@ public class InternetConnectivityPanelTest { PanelContentCallback mPanelContentCallback; @Mock InternetUpdater mInternetUpdater; + @Mock + private WifiManager mWifiManager; + @Mock + private ProviderModelSliceHelper mProviderModelSliceHelper; private Context mContext; private InternetConnectivityPanel mPanel; @@ -69,11 +84,14 @@ public class InternetConnectivityPanelTest { @Before public void setUp() { mContext = spy(ApplicationProvider.getApplicationContext()); + when(mContext.getApplicationContext()).thenReturn(mContext); + when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager); mPanel = InternetConnectivityPanel.create(mContext); mPanel.registerCallback(mPanelContentCallback); mPanel.mIsProviderModelEnabled = true; mPanel.mInternetUpdater = mInternetUpdater; + mPanel.mProviderModelSliceHelper = mProviderModelSliceHelper; } @Test @@ -90,13 +108,6 @@ public class InternetConnectivityPanelTest { assertThat(mPanel.getTitle()).isEqualTo(TITLE_APM); } - @Test - public void getSubTitle_apmOff_shouldBeNull() { - doReturn(false).when(mInternetUpdater).isAirplaneModeOn(); - - assertThat(mPanel.getSubTitle()).isNull(); - } - @Test public void getSubTitle_apmOnWifiOff_shouldBeNull() { doReturn(true).when(mInternetUpdater).isAirplaneModeOn(); @@ -110,9 +121,43 @@ public class InternetConnectivityPanelTest { doReturn(true).when(mInternetUpdater).isAirplaneModeOn(); doReturn(true).when(mInternetUpdater).isWifiEnabled(); + mPanel.updatePanelTitle(); + assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_WIFI_IS_TURNED_ON); } + @Test + public void getSubTitle_apmOffWifiOnNoWifiListHasCarrierData_NonCarrierNetworkUnavailable() { + List wifiList = new ArrayList(); + mockCondition(false, true, true, true, wifiList); + + mPanel.updatePanelTitle(); + + assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_NON_CARRIER_NETWORK_UNAVAILABLE); + } + + @Test + public void getSubTitle_apmOffWifiOnNoWifiListNoCarrierData_AllNetworkUnavailable() { + List wifiList = new ArrayList(); + mockCondition(false, true, false, true, wifiList); + + mPanel.updatePanelTitle(); + + assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_ALL_NETWORK_UNAVAILABLE); + } + + @Test + public void getSubTitle_apmOffWifiOnTwoWifiItemsNoCarrierData_shouldBeNull() { + List wifiList = new ArrayList(); + wifiList.add(new ScanResult()); + wifiList.add(new ScanResult()); + mockCondition(false, true, false, true, wifiList); + + mPanel.updatePanelTitle(); + + assertThat(mPanel.getSubTitle()).isNull(); + } + @Test public void getCustomizedButtonTitle_apmOff_shouldBeSettings() { doReturn(false).when(mInternetUpdater).isAirplaneModeOn(); @@ -244,4 +289,13 @@ public class InternetConnectivityPanelTest { verify(mPanelContentCallback).onCustomizedButtonStateChanged(); } + + private void mockCondition(boolean airplaneMode, boolean hasCarrier, + boolean isDataSimActive, boolean isWifiEnabled, List wifiItems) { + doReturn(airplaneMode).when(mInternetUpdater).isAirplaneModeOn(); + when(mProviderModelSliceHelper.hasCarrier()).thenReturn(hasCarrier); + when(mProviderModelSliceHelper.isDataSimActive()).thenReturn(isDataSimActive); + doReturn(isWifiEnabled).when(mInternetUpdater).isWifiEnabled(); + doReturn(wifiItems).when(mWifiManager).getScanResults(); + } }