1 package com.android.systemui.qs.tiles.dialog; 2 3 import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_PHONE; 4 import static android.provider.Settings.Global.AIRPLANE_MODE_ON; 5 import static android.telephony.SignalStrength.NUM_SIGNAL_STRENGTH_BINS; 6 import static android.telephony.SignalStrength.SIGNAL_STRENGTH_GREAT; 7 import static android.telephony.SignalStrength.SIGNAL_STRENGTH_POOR; 8 import static android.telephony.SubscriptionManager.PROFILE_CLASS_PROVISIONING; 9 10 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; 11 import static com.android.settingslib.wifi.WifiUtils.getHotspotIconResource; 12 import static com.android.systemui.qs.tiles.dialog.InternetDetailsContentController.TOAST_PARAMS_HORIZONTAL_WEIGHT; 13 import static com.android.systemui.qs.tiles.dialog.InternetDetailsContentController.TOAST_PARAMS_VERTICAL_WEIGHT; 14 import static com.android.wifitrackerlib.WifiEntry.WIFI_LEVEL_MAX; 15 import static com.android.wifitrackerlib.WifiEntry.WIFI_LEVEL_MIN; 16 import static com.android.wifitrackerlib.WifiEntry.WIFI_LEVEL_UNREACHABLE; 17 18 import static com.google.common.truth.Truth.assertThat; 19 20 import static org.junit.Assert.assertFalse; 21 import static org.junit.Assert.assertTrue; 22 import static org.mockito.ArgumentMatchers.any; 23 import static org.mockito.ArgumentMatchers.anyBoolean; 24 import static org.mockito.ArgumentMatchers.anyInt; 25 import static org.mockito.ArgumentMatchers.anyString; 26 import static org.mockito.ArgumentMatchers.eq; 27 import static org.mockito.Mockito.doReturn; 28 import static org.mockito.Mockito.mock; 29 import static org.mockito.Mockito.never; 30 import static org.mockito.Mockito.reset; 31 import static org.mockito.Mockito.spy; 32 import static org.mockito.Mockito.times; 33 import static org.mockito.Mockito.verify; 34 import static org.mockito.Mockito.when; 35 36 import android.animation.Animator; 37 import android.content.Intent; 38 import android.content.res.Configuration; 39 import android.content.res.Resources; 40 import android.graphics.PixelFormat; 41 import android.graphics.drawable.Drawable; 42 import android.net.ConnectivityManager; 43 import android.net.Network; 44 import android.net.NetworkCapabilities; 45 import android.net.wifi.WifiConfiguration; 46 import android.net.wifi.WifiManager; 47 import android.os.Handler; 48 import android.telephony.ServiceState; 49 import android.telephony.SignalStrength; 50 import android.telephony.SubscriptionInfo; 51 import android.telephony.SubscriptionManager; 52 import android.telephony.TelephonyCallback; 53 import android.telephony.TelephonyDisplayInfo; 54 import android.telephony.TelephonyManager; 55 import android.testing.TestableLooper; 56 import android.testing.TestableResources; 57 import android.text.TextUtils; 58 import android.view.Gravity; 59 import android.view.View; 60 import android.view.WindowManager; 61 62 import androidx.test.ext.junit.runners.AndroidJUnit4; 63 import androidx.test.filters.SmallTest; 64 65 import com.android.internal.logging.UiEventLogger; 66 import com.android.keyguard.KeyguardUpdateMonitor; 67 import com.android.settingslib.wifi.WifiUtils; 68 import com.android.settingslib.wifi.dpp.WifiDppIntentHelper; 69 import com.android.systemui.SysuiTestCase; 70 import com.android.systemui.animation.DialogTransitionAnimator; 71 import com.android.systemui.broadcast.BroadcastDispatcher; 72 import com.android.systemui.flags.FakeFeatureFlags; 73 import com.android.systemui.flags.Flags; 74 import com.android.systemui.plugins.ActivityStarter; 75 import com.android.systemui.res.R; 76 import com.android.systemui.statusbar.connectivity.AccessPointController; 77 import com.android.systemui.statusbar.policy.KeyguardStateController; 78 import com.android.systemui.statusbar.policy.LocationController; 79 import com.android.systemui.toast.SystemUIToast; 80 import com.android.systemui.toast.ToastFactory; 81 import com.android.systemui.util.CarrierConfigTracker; 82 import com.android.systemui.util.concurrency.FakeExecutor; 83 import com.android.systemui.util.settings.GlobalSettings; 84 import com.android.systemui.util.time.FakeSystemClock; 85 import com.android.wifitrackerlib.HotspotNetworkEntry; 86 import com.android.wifitrackerlib.MergedCarrierEntry; 87 import com.android.wifitrackerlib.WifiEntry; 88 89 import org.junit.After; 90 import org.junit.Before; 91 import org.junit.Test; 92 import org.junit.runner.RunWith; 93 import org.mockito.ArgumentCaptor; 94 import org.mockito.Mock; 95 import org.mockito.MockitoAnnotations; 96 import org.mockito.MockitoSession; 97 import org.mockito.quality.Strictness; 98 99 import java.util.ArrayList; 100 import java.util.List; 101 import java.util.Locale; 102 import java.util.Map; 103 104 @SmallTest 105 @RunWith(AndroidJUnit4.class) 106 @TestableLooper.RunWithLooper(setAsMainLooper = true) 107 public class InternetDetailsContentControllerTest extends SysuiTestCase { 108 109 private static final int SUB_ID = 1; 110 private static final int SUB_ID2 = 2; 111 112 private MockitoSession mStaticMockSession; 113 114 //SystemUIToast 115 private static final int GRAVITY_FLAGS = Gravity.FILL_HORIZONTAL | Gravity.FILL_VERTICAL; 116 private static final int TOAST_MESSAGE_STRING_ID = 1; 117 private static final String TOAST_MESSAGE_STRING = "toast message"; 118 119 @Mock 120 private WifiManager mWifiManager; 121 @Mock 122 private ConnectivityManager mConnectivityManager; 123 @Mock 124 private Network mNetwork; 125 @Mock 126 private NetworkCapabilities mNetworkCapabilities; 127 @Mock 128 private TelephonyManager mTelephonyManager; 129 @Mock 130 private SubscriptionManager mSubscriptionManager; 131 @Mock 132 private Handler mHandler; 133 @Mock 134 private Handler mWorkerHandler; 135 @Mock 136 private ActivityStarter mActivityStarter; 137 @Mock 138 private GlobalSettings mGlobalSettings; 139 @Mock 140 private KeyguardStateController mKeyguardStateController; 141 @Mock 142 private AccessPointController mAccessPointController; 143 @Mock 144 private WifiEntry mConnectedEntry; 145 @Mock 146 private WifiEntry mWifiEntry1; 147 @Mock 148 private WifiEntry mWifiEntry2; 149 @Mock 150 private WifiEntry mWifiEntry3; 151 @Mock 152 private WifiEntry mWifiEntry4; 153 @Mock 154 private MergedCarrierEntry mMergedCarrierEntry; 155 @Mock 156 private ServiceState mServiceState; 157 @Mock 158 private BroadcastDispatcher mBroadcastDispatcher; 159 @Mock 160 private WifiUtils.InternetIconInjector mWifiIconInjector; 161 @Mock 162 InternetDetailsContentController.InternetDialogCallback mInternetDialogCallback; 163 @Mock 164 private WindowManager mWindowManager; 165 @Mock 166 private ToastFactory mToastFactory; 167 @Mock 168 private SystemUIToast mSystemUIToast; 169 @Mock 170 private View mToastView; 171 @Mock 172 private Animator mAnimator; 173 @Mock 174 private CarrierConfigTracker mCarrierConfigTracker; 175 @Mock 176 private LocationController mLocationController; 177 @Mock 178 private DialogTransitionAnimator mDialogTransitionAnimator; 179 @Mock 180 private View mDialogLaunchView; 181 @Mock 182 private WifiStateWorker mWifiStateWorker; 183 @Mock 184 private SignalStrength mSignalStrength; 185 @Mock 186 private WifiConfiguration mWifiConfiguration; 187 188 private FakeFeatureFlags mFlags = new FakeFeatureFlags(); 189 190 private TestableResources mTestableResources; 191 private InternetDetailsContentController mInternetDetailsContentController; 192 private FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock()); 193 private List<WifiEntry> mAccessPoints = new ArrayList<>(); 194 private List<WifiEntry> mWifiEntries = new ArrayList<>(); 195 196 private Configuration mConfig; 197 198 @Before setUp()199 public void setUp() { 200 mStaticMockSession = mockitoSession() 201 .mockStatic(SubscriptionManager.class) 202 .mockStatic(WifiDppIntentHelper.class) 203 .strictness(Strictness.LENIENT) 204 .startMocking(); 205 MockitoAnnotations.initMocks(this); 206 mTestableResources = mContext.getOrCreateTestableResources(); 207 doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(anyInt()); 208 when(mTelephonyManager.getSignalStrength()).thenReturn(mSignalStrength); 209 when(mSignalStrength.getLevel()).thenReturn(SIGNAL_STRENGTH_GREAT); 210 when(mKeyguardStateController.isUnlocked()).thenReturn(true); 211 when(mConnectedEntry.isDefaultNetwork()).thenReturn(true); 212 when(mConnectedEntry.hasInternetAccess()).thenReturn(true); 213 when(mWifiEntry1.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_DISCONNECTED); 214 when(mWifiEntry2.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_DISCONNECTED); 215 when(mWifiEntry3.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_DISCONNECTED); 216 when(mWifiEntry4.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_DISCONNECTED); 217 mAccessPoints.add(mConnectedEntry); 218 mAccessPoints.add(mWifiEntry1); 219 when(mAccessPointController.getMergedCarrierEntry()).thenReturn(mMergedCarrierEntry); 220 when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[]{SUB_ID}); 221 when(SubscriptionManager.getDefaultDataSubscriptionId()).thenReturn(SUB_ID); 222 SubscriptionInfo info = mock(SubscriptionInfo.class); 223 when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(info); 224 when(mToastFactory.createToast(any(), any(), anyString(), anyString(), anyInt(), anyInt())) 225 .thenReturn(mSystemUIToast); 226 when(mSystemUIToast.getView()).thenReturn(mToastView); 227 when(mSystemUIToast.getGravity()).thenReturn(GRAVITY_FLAGS); 228 when(mSystemUIToast.getInAnimation()).thenReturn(mAnimator); 229 when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); 230 231 mInternetDetailsContentController = new InternetDetailsContentController(mContext, 232 mock(UiEventLogger.class), mock(ActivityStarter.class), mAccessPointController, 233 mSubscriptionManager, mTelephonyManager, mWifiManager, 234 mConnectivityManager, mHandler, mExecutor, mBroadcastDispatcher, 235 mock(KeyguardUpdateMonitor.class), mGlobalSettings, mKeyguardStateController, 236 mWindowManager, mToastFactory, mWorkerHandler, mCarrierConfigTracker, 237 mLocationController, mDialogTransitionAnimator, mWifiStateWorker, mFlags); 238 mSubscriptionManager.addOnSubscriptionsChangedListener(mExecutor, 239 mInternetDetailsContentController.mOnSubscriptionsChangedListener); 240 mInternetDetailsContentController.onStart(mInternetDialogCallback, true); 241 mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); 242 mInternetDetailsContentController.mActivityStarter = mActivityStarter; 243 mInternetDetailsContentController.mWifiIconInjector = mWifiIconInjector; 244 mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, false); 245 mFlags.set(Flags.SHARE_WIFI_QS_BUTTON, false); 246 247 mConfig = new Configuration(mContext.getResources().getConfiguration()); 248 Configuration c2 = new Configuration(mConfig); 249 c2.setLocale(Locale.US); 250 mContext.getResources().updateConfiguration(c2, null); 251 } 252 253 @After tearDown()254 public void tearDown() { 255 mStaticMockSession.finishMocking(); 256 mContext.getResources().updateConfiguration(mConfig, null); 257 } 258 259 @Test connectCarrierNetwork_mergedCarrierEntryCanConnect_connectAndCreateSysUiToast()260 public void connectCarrierNetwork_mergedCarrierEntryCanConnect_connectAndCreateSysUiToast() { 261 InternetDetailsContentController spyController = spy(mInternetDetailsContentController); 262 when(spyController.isMobileDataEnabled()).thenReturn(true); 263 when(mKeyguardStateController.isUnlocked()).thenReturn(true); 264 when(mConnectivityManager.getActiveNetwork()).thenReturn(mNetwork); 265 when(mConnectivityManager.getNetworkCapabilities(mNetwork)) 266 .thenReturn(mNetworkCapabilities); 267 when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) 268 .thenReturn(false); 269 270 when(mMergedCarrierEntry.canConnect()).thenReturn(true); 271 mTestableResources.addOverride(R.string.wifi_wont_autoconnect_for_now, 272 TOAST_MESSAGE_STRING); 273 274 spyController.connectCarrierNetwork(); 275 276 verify(mMergedCarrierEntry).connect(null /* callback */, false /* showToast */); 277 verify(mToastFactory).createToast(any(), any(), eq(TOAST_MESSAGE_STRING), anyString(), 278 anyInt(), anyInt()); 279 } 280 281 @Test connectCarrierNetwork_mergedCarrierEntryCanConnect_doNothingWhenSettingsOff()282 public void connectCarrierNetwork_mergedCarrierEntryCanConnect_doNothingWhenSettingsOff() { 283 InternetDetailsContentController spyController = spy(mInternetDetailsContentController); 284 when(spyController.isMobileDataEnabled()).thenReturn(false); 285 mTestableResources.addOverride(R.string.wifi_wont_autoconnect_for_now, 286 TOAST_MESSAGE_STRING); 287 288 spyController.connectCarrierNetwork(); 289 290 verify(mMergedCarrierEntry, never()).connect(null /* callback */, false /* showToast */); 291 verify(mToastFactory, never()).createToast(any(), any(), anyString(), anyString(), anyInt(), 292 anyInt()); 293 } 294 295 @Test connectCarrierNetwork_mergedCarrierEntryCanConnect_doNothingWhenKeyguardLocked()296 public void connectCarrierNetwork_mergedCarrierEntryCanConnect_doNothingWhenKeyguardLocked() { 297 InternetDetailsContentController spyController = spy(mInternetDetailsContentController); 298 when(spyController.isMobileDataEnabled()).thenReturn(true); 299 when(mKeyguardStateController.isUnlocked()).thenReturn(false); 300 301 mTestableResources.addOverride(R.string.wifi_wont_autoconnect_for_now, 302 TOAST_MESSAGE_STRING); 303 spyController.connectCarrierNetwork(); 304 305 verify(mMergedCarrierEntry, never()).connect(null /* callback */, false /* showToast */); 306 verify(mToastFactory, never()).createToast(any(), any(), anyString(), anyString(), anyInt(), 307 anyInt()); 308 } 309 310 @Test connectCarrierNetwork_mergedCarrierEntryCanConnect_doNothingWhenMobileIsPrimary()311 public void connectCarrierNetwork_mergedCarrierEntryCanConnect_doNothingWhenMobileIsPrimary() { 312 when(mKeyguardStateController.isUnlocked()).thenReturn(true); 313 when(mConnectivityManager.getActiveNetwork()).thenReturn(mNetwork); 314 when(mConnectivityManager.getNetworkCapabilities(mNetwork)) 315 .thenReturn(mNetworkCapabilities); 316 when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) 317 .thenReturn(true); 318 319 mTestableResources.addOverride(R.string.wifi_wont_autoconnect_for_now, 320 TOAST_MESSAGE_STRING); 321 mInternetDetailsContentController.connectCarrierNetwork(); 322 323 verify(mMergedCarrierEntry, never()).connect(null /* callback */, false /* showToast */); 324 verify(mToastFactory, never()).createToast(any(), any(), anyString(), anyString(), anyInt(), 325 anyInt()); 326 } 327 328 @Test makeOverlayToast_withGravityFlags_addViewWithLayoutParams()329 public void makeOverlayToast_withGravityFlags_addViewWithLayoutParams() { 330 mTestableResources.addOverride(TOAST_MESSAGE_STRING_ID, TOAST_MESSAGE_STRING); 331 332 mInternetDetailsContentController.makeOverlayToast(TOAST_MESSAGE_STRING_ID); 333 334 ArgumentCaptor<WindowManager.LayoutParams> paramsCaptor = ArgumentCaptor.forClass( 335 WindowManager.LayoutParams.class); 336 verify(mWindowManager).addView(eq(mToastView), paramsCaptor.capture()); 337 WindowManager.LayoutParams params = paramsCaptor.getValue(); 338 assertThat(params.format).isEqualTo(PixelFormat.TRANSLUCENT); 339 assertThat(params.type).isEqualTo(WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL); 340 assertThat(params.horizontalWeight).isEqualTo(TOAST_PARAMS_HORIZONTAL_WEIGHT); 341 assertThat(params.verticalWeight).isEqualTo(TOAST_PARAMS_VERTICAL_WEIGHT); 342 } 343 344 @Test makeOverlayToast_withAnimation_verifyAnimatorStart()345 public void makeOverlayToast_withAnimation_verifyAnimatorStart() { 346 mTestableResources.addOverride(TOAST_MESSAGE_STRING_ID, TOAST_MESSAGE_STRING); 347 348 mInternetDetailsContentController.makeOverlayToast(TOAST_MESSAGE_STRING_ID); 349 350 verify(mAnimator).start(); 351 } 352 353 @Test getDialogTitleText_withAirplaneModeOn_returnAirplaneMode()354 public void getDialogTitleText_withAirplaneModeOn_returnAirplaneMode() { 355 fakeAirplaneModeEnabled(true); 356 357 assertTrue(TextUtils.equals(mInternetDetailsContentController.getDialogTitleText(), 358 getResourcesString("airplane_mode"))); 359 } 360 361 @Test getDialogTitleText_withAirplaneModeOff_returnInternet()362 public void getDialogTitleText_withAirplaneModeOff_returnInternet() { 363 fakeAirplaneModeEnabled(false); 364 365 assertTrue(TextUtils.equals(mInternetDetailsContentController.getDialogTitleText(), 366 getResourcesString("quick_settings_internet_label"))); 367 } 368 369 @Test getSubtitleText_withApmOnAndWifiOff_returnWifiIsOff()370 public void getSubtitleText_withApmOnAndWifiOff_returnWifiIsOff() { 371 fakeAirplaneModeEnabled(true); 372 when(mWifiStateWorker.isWifiEnabled()).thenReturn(false); 373 374 assertThat(mInternetDetailsContentController.getSubtitleText(false)) 375 .isEqualTo(getResourcesString("wifi_is_off")); 376 377 // if the Wi-Fi disallow config, then don't return Wi-Fi related string. 378 mInternetDetailsContentController.mCanConfigWifi = false; 379 380 assertThat(mInternetDetailsContentController.getSubtitleText(false)) 381 .isNotEqualTo(getResourcesString("wifi_is_off")); 382 } 383 384 @Test getSubtitleText_withWifiOff_returnWifiIsOff()385 public void getSubtitleText_withWifiOff_returnWifiIsOff() { 386 fakeAirplaneModeEnabled(false); 387 when(mWifiStateWorker.isWifiEnabled()).thenReturn(false); 388 389 assertThat(mInternetDetailsContentController.getSubtitleText(false)) 390 .isEqualTo(getResourcesString("wifi_is_off")); 391 392 // if the Wi-Fi disallow config, then don't return Wi-Fi related string. 393 mInternetDetailsContentController.mCanConfigWifi = false; 394 395 assertThat(mInternetDetailsContentController.getSubtitleText(false)) 396 .isNotEqualTo(getResourcesString("wifi_is_off")); 397 } 398 399 @Test getSubtitleText_withNoWifiEntry_returnSearchWifi()400 public void getSubtitleText_withNoWifiEntry_returnSearchWifi() { 401 fakeAirplaneModeEnabled(false); 402 when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); 403 mInternetDetailsContentController.onAccessPointsChanged(null /* accessPoints */); 404 405 assertThat(mInternetDetailsContentController.getSubtitleText(true)) 406 .isEqualTo(getResourcesString("wifi_empty_list_wifi_on")); 407 408 // if the Wi-Fi disallow config, then don't return Wi-Fi related string. 409 mInternetDetailsContentController.mCanConfigWifi = false; 410 411 assertThat(mInternetDetailsContentController.getSubtitleText(true)) 412 .isNotEqualTo(getResourcesString("wifi_empty_list_wifi_on")); 413 } 414 415 @Test getSubtitleText_withWifiEntry_returnTapToConnect()416 public void getSubtitleText_withWifiEntry_returnTapToConnect() { 417 // The preconditions WiFi Entries is already in setUp() 418 fakeAirplaneModeEnabled(false); 419 when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); 420 421 assertThat(mInternetDetailsContentController.getSubtitleText(false)) 422 .isEqualTo(getResourcesString("tap_a_network_to_connect")); 423 424 // if the Wi-Fi disallow config, then don't return Wi-Fi related string. 425 mInternetDetailsContentController.mCanConfigWifi = false; 426 427 assertThat(mInternetDetailsContentController.getSubtitleText(false)) 428 .isNotEqualTo(getResourcesString("tap_a_network_to_connect")); 429 } 430 431 @Test getSubtitleText_deviceLockedWithWifiOn_returnUnlockToViewNetworks()432 public void getSubtitleText_deviceLockedWithWifiOn_returnUnlockToViewNetworks() { 433 fakeAirplaneModeEnabled(false); 434 when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); 435 when(mKeyguardStateController.isUnlocked()).thenReturn(false); 436 437 assertTrue(TextUtils.equals(mInternetDetailsContentController.getSubtitleText(false), 438 getResourcesString("unlock_to_view_networks"))); 439 } 440 441 @Test getSubtitleText_withNoService_returnNoNetworksAvailable()442 public void getSubtitleText_withNoService_returnNoNetworksAvailable() { 443 mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true); 444 InternetDetailsContentController spyController = spy(mInternetDetailsContentController); 445 fakeAirplaneModeEnabled(false); 446 when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); 447 spyController.onAccessPointsChanged(null /* accessPoints */); 448 449 doReturn(SUB_ID).when(spyController).getActiveAutoSwitchNonDdsSubId(); 450 doReturn(ServiceState.STATE_OUT_OF_SERVICE).when(mServiceState).getState(); 451 spyController.mSubIdServiceState.put(SUB_ID2, mServiceState); 452 453 assertFalse(TextUtils.equals(spyController.getSubtitleText(false), 454 getResourcesString("all_network_unavailable"))); 455 456 doReturn(SubscriptionManager.INVALID_SUBSCRIPTION_ID) 457 .when(spyController).getActiveAutoSwitchNonDdsSubId(); 458 spyController.onAccessPointsChanged(null /* accessPoints */); 459 assertTrue(TextUtils.equals(spyController.getSubtitleText(false), 460 getResourcesString("all_network_unavailable"))); 461 } 462 463 @Test getSubtitleText_withNoService_returnNoNetworksAvailable_flagOff()464 public void getSubtitleText_withNoService_returnNoNetworksAvailable_flagOff() { 465 InternetDetailsContentController spyController = spy(mInternetDetailsContentController); 466 fakeAirplaneModeEnabled(false); 467 when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); 468 spyController.onAccessPointsChanged(null /* accessPoints */); 469 470 doReturn(ServiceState.STATE_OUT_OF_SERVICE).when(mServiceState).getState(); 471 spyController.mSubIdServiceState.put(SUB_ID, mServiceState); 472 473 assertTrue(TextUtils.equals(spyController.getSubtitleText(false), 474 getResourcesString("all_network_unavailable"))); 475 476 doReturn(SubscriptionManager.INVALID_SUBSCRIPTION_ID) 477 .when(spyController).getActiveAutoSwitchNonDdsSubId(); 478 spyController.onAccessPointsChanged(null /* accessPoints */); 479 assertTrue(TextUtils.equals(spyController.getSubtitleText(false), 480 getResourcesString("all_network_unavailable"))); 481 } 482 483 @Test getSubtitleText_withMobileDataDisabled_returnNoOtherAvailable()484 public void getSubtitleText_withMobileDataDisabled_returnNoOtherAvailable() { 485 fakeAirplaneModeEnabled(false); 486 when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); 487 mInternetDetailsContentController.onAccessPointsChanged(null /* accessPoints */); 488 InternetDetailsContentController spyController = spy(mInternetDetailsContentController); 489 490 doReturn(ServiceState.STATE_IN_SERVICE).when(mServiceState).getState(); 491 spyController.mSubIdServiceState.put(SUB_ID, mServiceState); 492 493 assertThat(mInternetDetailsContentController.getSubtitleText(false)) 494 .isEqualTo(getResourcesString("non_carrier_network_unavailable")); 495 496 // if the Wi-Fi disallow config, then don't return Wi-Fi related string. 497 mInternetDetailsContentController.mCanConfigWifi = false; 498 499 when(spyController.isMobileDataEnabled()).thenReturn(false); 500 501 502 assertThat(mInternetDetailsContentController.getSubtitleText(false)) 503 .isNotEqualTo(getResourcesString("non_carrier_network_unavailable")); 504 } 505 506 @Test getSubtitleText_withCarrierNetworkActiveOnly_returnNoOtherAvailable()507 public void getSubtitleText_withCarrierNetworkActiveOnly_returnNoOtherAvailable() { 508 fakeAirplaneModeEnabled(false); 509 when(mWifiStateWorker.isWifiEnabled()).thenReturn(true); 510 mInternetDetailsContentController.onAccessPointsChanged(null /* accessPoints */); 511 when(mMergedCarrierEntry.isDefaultNetwork()).thenReturn(true); 512 513 assertThat(mInternetDetailsContentController.getSubtitleText(false)) 514 .isEqualTo(getResourcesString("non_carrier_network_unavailable")); 515 } 516 517 @Test getWifiDetailsSettingsIntent_withNoKey_returnNull()518 public void getWifiDetailsSettingsIntent_withNoKey_returnNull() { 519 assertThat(mInternetDetailsContentController.getWifiDetailsSettingsIntent(null)).isNull(); 520 } 521 522 @Test getWifiDetailsSettingsIntent_withKey_returnIntent()523 public void getWifiDetailsSettingsIntent_withKey_returnIntent() { 524 assertThat(mInternetDetailsContentController.getWifiDetailsSettingsIntent( 525 "test_key")).isNotNull(); 526 } 527 528 @Test getInternetWifiDrawable_withConnectedEntry_returnIntentIconWithCorrectColor()529 public void getInternetWifiDrawable_withConnectedEntry_returnIntentIconWithCorrectColor() { 530 final Drawable drawable = mock(Drawable.class); 531 when(mWifiIconInjector.getIcon(anyBoolean(), anyInt())).thenReturn(drawable); 532 533 mInternetDetailsContentController.getInternetWifiDrawable(mConnectedEntry); 534 535 verify(mWifiIconInjector).getIcon(eq(false), anyInt()); 536 verify(drawable).setTint(mContext.getColor(R.color.connected_network_primary_color)); 537 } 538 539 @Test getWifiDrawable_withWifiLevelUnreachable_returnNull()540 public void getWifiDrawable_withWifiLevelUnreachable_returnNull() { 541 when(mConnectedEntry.getLevel()).thenReturn(WIFI_LEVEL_UNREACHABLE); 542 543 assertThat(mInternetDetailsContentController.getWifiDrawable(mConnectedEntry)).isNull(); 544 } 545 546 @Test getWifiDrawable_withHotspotNetworkEntry_returnHotspotDrawable()547 public void getWifiDrawable_withHotspotNetworkEntry_returnHotspotDrawable() { 548 HotspotNetworkEntry entry = mock(HotspotNetworkEntry.class); 549 when(entry.getDeviceType()).thenReturn(DEVICE_TYPE_PHONE); 550 Drawable hotspotDrawable = mock(Drawable.class); 551 mTestableResources.addOverride(getHotspotIconResource(DEVICE_TYPE_PHONE), hotspotDrawable); 552 553 assertThat(mInternetDetailsContentController.getWifiDrawable(entry)).isEqualTo( 554 hotspotDrawable); 555 } 556 557 @Test startActivityForDialog_always_startActivityWithoutDismissShade()558 public void startActivityForDialog_always_startActivityWithoutDismissShade() { 559 mInternetDetailsContentController.startActivityForDialog(mock(Intent.class)); 560 561 verify(mActivityStarter).startActivity(any(Intent.class), eq(false) /* dismissShade */); 562 } 563 564 @Test launchWifiDetailsSetting_withNoWifiEntryKey_doNothing()565 public void launchWifiDetailsSetting_withNoWifiEntryKey_doNothing() { 566 mInternetDetailsContentController.launchWifiDetailsSetting(null /* key */, 567 mDialogLaunchView); 568 569 verify(mActivityStarter, never()) 570 .postStartActivityDismissingKeyguard(any(Intent.class), anyInt()); 571 } 572 573 @Test launchWifiDetailsSetting_withWifiEntryKey_startActivity()574 public void launchWifiDetailsSetting_withWifiEntryKey_startActivity() { 575 mInternetDetailsContentController.launchWifiDetailsSetting("wifi_entry_key", 576 mDialogLaunchView); 577 578 verify(mActivityStarter).postStartActivityDismissingKeyguard(any(Intent.class), anyInt(), 579 any()); 580 } 581 582 @Test isDeviceLocked_keyguardIsUnlocked_returnFalse()583 public void isDeviceLocked_keyguardIsUnlocked_returnFalse() { 584 when(mKeyguardStateController.isUnlocked()).thenReturn(true); 585 586 assertThat(mInternetDetailsContentController.isDeviceLocked()).isFalse(); 587 } 588 589 @Test isDeviceLocked_keyguardIsLocked_returnTrue()590 public void isDeviceLocked_keyguardIsLocked_returnTrue() { 591 when(mKeyguardStateController.isUnlocked()).thenReturn(false); 592 593 assertThat(mInternetDetailsContentController.isDeviceLocked()).isTrue(); 594 } 595 596 @Test onAccessPointsChanged_canNotConfigWifi_doNothing()597 public void onAccessPointsChanged_canNotConfigWifi_doNothing() { 598 reset(mInternetDialogCallback); 599 mInternetDetailsContentController.mCanConfigWifi = false; 600 601 mInternetDetailsContentController.onAccessPointsChanged(null /* accessPoints */); 602 603 verify(mInternetDialogCallback, never()).onAccessPointsChanged(any(), any(), anyBoolean()); 604 } 605 606 @Test onAccessPointsChanged_nullAccessPoints_callbackBothNull()607 public void onAccessPointsChanged_nullAccessPoints_callbackBothNull() { 608 reset(mInternetDialogCallback); 609 610 mInternetDetailsContentController.onAccessPointsChanged(null /* accessPoints */); 611 612 verify(mInternetDialogCallback).onAccessPointsChanged(null /* wifiEntries */, 613 null /* connectedEntry */, false /* hasMoreEntry */); 614 } 615 616 @Test onAccessPointsChanged_oneConnectedEntry_callbackConnectedEntryOnly()617 public void onAccessPointsChanged_oneConnectedEntry_callbackConnectedEntryOnly() { 618 reset(mInternetDialogCallback); 619 mAccessPoints.clear(); 620 mAccessPoints.add(mConnectedEntry); 621 622 mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); 623 624 mWifiEntries.clear(); 625 verify(mInternetDialogCallback).onAccessPointsChanged(mWifiEntries, mConnectedEntry, 626 false /* hasMoreEntry */); 627 } 628 629 @Test onAccessPointsChanged_noConnectedEntryAndOneOther_callbackWifiEntriesOnly()630 public void onAccessPointsChanged_noConnectedEntryAndOneOther_callbackWifiEntriesOnly() { 631 reset(mInternetDialogCallback); 632 mAccessPoints.clear(); 633 mAccessPoints.add(mWifiEntry1); 634 635 mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); 636 637 mWifiEntries.clear(); 638 mWifiEntries.add(mWifiEntry1); 639 verify(mInternetDialogCallback).onAccessPointsChanged(mWifiEntries, 640 null /* connectedEntry */, false /* hasMoreEntry */); 641 } 642 643 @Test onAccessPointsChanged_oneConnectedEntryAndOneOther_callbackCorrectly()644 public void onAccessPointsChanged_oneConnectedEntryAndOneOther_callbackCorrectly() { 645 reset(mInternetDialogCallback); 646 mAccessPoints.clear(); 647 mAccessPoints.add(mConnectedEntry); 648 mAccessPoints.add(mWifiEntry1); 649 650 mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); 651 652 mWifiEntries.clear(); 653 mWifiEntries.add(mWifiEntry1); 654 verify(mInternetDialogCallback).onAccessPointsChanged(mWifiEntries, mConnectedEntry, 655 false /* hasMoreEntry */); 656 } 657 658 @Test onAccessPointsChanged_oneConnectedEntryAndTwoOthers_callbackCorrectly()659 public void onAccessPointsChanged_oneConnectedEntryAndTwoOthers_callbackCorrectly() { 660 reset(mInternetDialogCallback); 661 mAccessPoints.clear(); 662 mAccessPoints.add(mConnectedEntry); 663 mAccessPoints.add(mWifiEntry1); 664 mAccessPoints.add(mWifiEntry2); 665 666 mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); 667 668 mWifiEntries.clear(); 669 mWifiEntries.add(mWifiEntry1); 670 mWifiEntries.add(mWifiEntry2); 671 verify(mInternetDialogCallback).onAccessPointsChanged(mWifiEntries, mConnectedEntry, 672 false /* hasMoreEntry */); 673 } 674 675 @Test onAccessPointsChanged_oneConnectedEntryAndThreeOthers_callbackCutMore()676 public void onAccessPointsChanged_oneConnectedEntryAndThreeOthers_callbackCutMore() { 677 reset(mInternetDialogCallback); 678 mAccessPoints.clear(); 679 mAccessPoints.add(mConnectedEntry); 680 mAccessPoints.add(mWifiEntry1); 681 mAccessPoints.add(mWifiEntry2); 682 mAccessPoints.add(mWifiEntry3); 683 684 mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); 685 686 mWifiEntries.clear(); 687 mWifiEntries.add(mWifiEntry1); 688 mWifiEntries.add(mWifiEntry2); 689 verify(mInternetDialogCallback).onAccessPointsChanged(mWifiEntries, mConnectedEntry, 690 true /* hasMoreEntry */); 691 } 692 693 @Test onAccessPointsChanged_fourWifiEntries_callbackCutMore()694 public void onAccessPointsChanged_fourWifiEntries_callbackCutMore() { 695 reset(mInternetDialogCallback); 696 mAccessPoints.clear(); 697 mAccessPoints.add(mWifiEntry1); 698 mAccessPoints.add(mWifiEntry2); 699 mAccessPoints.add(mWifiEntry3); 700 mAccessPoints.add(mWifiEntry4); 701 702 mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); 703 704 mWifiEntries.clear(); 705 mWifiEntries.add(mWifiEntry1); 706 mWifiEntries.add(mWifiEntry2); 707 mWifiEntries.add(mWifiEntry3); 708 verify(mInternetDialogCallback).onAccessPointsChanged(mWifiEntries, 709 null /* connectedEntry */, true /* hasMoreEntry */); 710 } 711 712 @Test onAccessPointsChanged_wifiIsDefaultButNoInternetAccess_putIntoWifiEntries()713 public void onAccessPointsChanged_wifiIsDefaultButNoInternetAccess_putIntoWifiEntries() { 714 reset(mInternetDialogCallback); 715 mAccessPoints.clear(); 716 when(mWifiEntry1.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED); 717 when(mWifiEntry1.isDefaultNetwork()).thenReturn(true); 718 when(mWifiEntry1.hasInternetAccess()).thenReturn(false); 719 mAccessPoints.add(mWifiEntry1); 720 721 mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); 722 723 mWifiEntries.clear(); 724 mWifiEntries.add(mWifiEntry1); 725 verify(mInternetDialogCallback).onAccessPointsChanged(mWifiEntries, 726 null /* connectedEntry */, false /* hasMoreEntry */); 727 } 728 729 @Test onAccessPointsChanged_connectedWifiNoInternetAccess_shouldSetListener()730 public void onAccessPointsChanged_connectedWifiNoInternetAccess_shouldSetListener() { 731 reset(mWifiEntry1); 732 mAccessPoints.clear(); 733 when(mWifiEntry1.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED); 734 when(mWifiEntry1.isDefaultNetwork()).thenReturn(true); 735 when(mWifiEntry1.hasInternetAccess()).thenReturn(false); 736 mAccessPoints.add(mWifiEntry1); 737 738 mInternetDetailsContentController.onAccessPointsChanged(mAccessPoints); 739 740 verify(mWifiEntry1).setListener( 741 mInternetDetailsContentController.mConnectedWifiInternetMonitor); 742 } 743 744 @Test onUpdated_connectedWifiHasInternetAccess_shouldScanWifiAccessPoints()745 public void onUpdated_connectedWifiHasInternetAccess_shouldScanWifiAccessPoints() { 746 reset(mAccessPointController); 747 when(mWifiEntry1.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED); 748 when(mWifiEntry1.isDefaultNetwork()).thenReturn(true); 749 when(mWifiEntry1.hasInternetAccess()).thenReturn(false); 750 InternetDetailsContentController.ConnectedWifiInternetMonitor 751 mConnectedWifiInternetMonitor = 752 mInternetDetailsContentController.mConnectedWifiInternetMonitor; 753 mConnectedWifiInternetMonitor.registerCallbackIfNeed(mWifiEntry1); 754 755 // When the hasInternetAccess() changed to true, and call back the onUpdated() function. 756 when(mWifiEntry1.hasInternetAccess()).thenReturn(true); 757 mConnectedWifiInternetMonitor.onUpdated(); 758 759 verify(mAccessPointController).scanForAccessPoints(); 760 } 761 762 @Test onWifiScan_isWifiEnabledFalse_callbackOnWifiScanFalse()763 public void onWifiScan_isWifiEnabledFalse_callbackOnWifiScanFalse() { 764 reset(mInternetDialogCallback); 765 when(mWifiStateWorker.isWifiEnabled()).thenReturn(false); 766 767 mInternetDetailsContentController.onWifiScan(true); 768 769 verify(mInternetDialogCallback).onWifiScan(false); 770 } 771 772 @Test onWifiScan_isDeviceLockedTrue_callbackOnWifiScanFalse()773 public void onWifiScan_isDeviceLockedTrue_callbackOnWifiScanFalse() { 774 reset(mInternetDialogCallback); 775 when(mKeyguardStateController.isUnlocked()).thenReturn(false); 776 777 mInternetDetailsContentController.onWifiScan(true); 778 779 verify(mInternetDialogCallback).onWifiScan(false); 780 } 781 782 @Test onWifiScan_onWifiScanFalse_callbackOnWifiScanFalse()783 public void onWifiScan_onWifiScanFalse_callbackOnWifiScanFalse() { 784 reset(mInternetDialogCallback); 785 786 mInternetDetailsContentController.onWifiScan(false); 787 788 verify(mInternetDialogCallback).onWifiScan(false); 789 } 790 791 @Test onWifiScan_onWifiScanTrue_callbackOnWifiScanTrue()792 public void onWifiScan_onWifiScanTrue_callbackOnWifiScanTrue() { 793 reset(mInternetDialogCallback); 794 795 mInternetDetailsContentController.onWifiScan(true); 796 797 verify(mInternetDialogCallback).onWifiScan(true); 798 } 799 800 @Test setMergedCarrierWifiEnabledIfNeed_carrierProvisionsEnabled_doNothing()801 public void setMergedCarrierWifiEnabledIfNeed_carrierProvisionsEnabled_doNothing() { 802 when(mCarrierConfigTracker.getCarrierProvisionsWifiMergedNetworksBool(SUB_ID)) 803 .thenReturn(true); 804 805 mInternetDetailsContentController.setMergedCarrierWifiEnabledIfNeed(SUB_ID, true); 806 807 verify(mMergedCarrierEntry, never()).setEnabled(anyBoolean()); 808 } 809 810 @Test setMergedCarrierWifiEnabledIfNeed_mergedCarrierEntryEmpty_doesntCrash()811 public void setMergedCarrierWifiEnabledIfNeed_mergedCarrierEntryEmpty_doesntCrash() { 812 when(mCarrierConfigTracker.getCarrierProvisionsWifiMergedNetworksBool(SUB_ID)) 813 .thenReturn(false); 814 when(mAccessPointController.getMergedCarrierEntry()).thenReturn(null); 815 816 mInternetDetailsContentController.setMergedCarrierWifiEnabledIfNeed(SUB_ID, true); 817 } 818 819 @Test setMergedCarrierWifiEnabledIfNeed_neededSetMergedCarrierEntry_setTogether()820 public void setMergedCarrierWifiEnabledIfNeed_neededSetMergedCarrierEntry_setTogether() { 821 when(mCarrierConfigTracker.getCarrierProvisionsWifiMergedNetworksBool(SUB_ID)) 822 .thenReturn(false); 823 824 mInternetDetailsContentController.setMergedCarrierWifiEnabledIfNeed(SUB_ID, true); 825 826 verify(mMergedCarrierEntry).setEnabled(true); 827 828 mInternetDetailsContentController.setMergedCarrierWifiEnabledIfNeed(SUB_ID, false); 829 830 verify(mMergedCarrierEntry).setEnabled(false); 831 } 832 833 @Test isWifiScanEnabled_locationOff_returnFalse()834 public void isWifiScanEnabled_locationOff_returnFalse() { 835 when(mLocationController.isLocationEnabled()).thenReturn(false); 836 when(mWifiManager.isScanAlwaysAvailable()).thenReturn(false); 837 838 assertThat(mInternetDetailsContentController.isWifiScanEnabled()).isFalse(); 839 840 when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true); 841 842 assertThat(mInternetDetailsContentController.isWifiScanEnabled()).isFalse(); 843 } 844 845 @Test isWifiScanEnabled_locationOn_returnIsScanAlwaysAvailable()846 public void isWifiScanEnabled_locationOn_returnIsScanAlwaysAvailable() { 847 when(mLocationController.isLocationEnabled()).thenReturn(true); 848 when(mWifiManager.isScanAlwaysAvailable()).thenReturn(false); 849 850 assertThat(mInternetDetailsContentController.isWifiScanEnabled()).isFalse(); 851 852 when(mWifiManager.isScanAlwaysAvailable()).thenReturn(true); 853 854 assertThat(mInternetDetailsContentController.isWifiScanEnabled()).isTrue(); 855 } 856 857 @Test getSignalStrengthIcon_differentSubId()858 public void getSignalStrengthIcon_differentSubId() { 859 mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true); 860 InternetDetailsContentController spyController = spy(mInternetDetailsContentController); 861 Drawable icons = spyController.getSignalStrengthIcon(SUB_ID, mContext, 1, 1, 0, false); 862 Drawable icons2 = spyController.getSignalStrengthIcon(SUB_ID2, mContext, 1, 1, 0, false); 863 864 assertThat(icons).isNotEqualTo(icons2); 865 } 866 867 @Test getActiveAutoSwitchNonDdsSubId()868 public void getActiveAutoSwitchNonDdsSubId() { 869 mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true); 870 // active on non-DDS 871 SubscriptionInfo info = mock(SubscriptionInfo.class); 872 doReturn(SUB_ID2).when(info).getSubscriptionId(); 873 when(mSubscriptionManager.getActiveSubscriptionInfo(anyInt())).thenReturn(info); 874 875 int subId = mInternetDetailsContentController.getActiveAutoSwitchNonDdsSubId(); 876 assertThat(subId).isEqualTo(SUB_ID2); 877 878 // active on CBRS 879 doReturn(true).when(info).isOpportunistic(); 880 subId = mInternetDetailsContentController.getActiveAutoSwitchNonDdsSubId(); 881 assertThat(subId).isEqualTo(SubscriptionManager.INVALID_SUBSCRIPTION_ID); 882 883 // active on DDS 884 doReturn(false).when(info).isOpportunistic(); 885 doReturn(SUB_ID).when(info).getSubscriptionId(); 886 when(mSubscriptionManager.getActiveSubscriptionInfo(anyInt())).thenReturn(info); 887 888 subId = mInternetDetailsContentController.getActiveAutoSwitchNonDdsSubId(); 889 assertThat(subId).isEqualTo(SubscriptionManager.INVALID_SUBSCRIPTION_ID); 890 } 891 892 @Test getActiveAutoSwitchNonDdsSubId_flagOff()893 public void getActiveAutoSwitchNonDdsSubId_flagOff() { 894 // active on non-DDS 895 SubscriptionInfo info = mock(SubscriptionInfo.class); 896 doReturn(SUB_ID2).when(info).getSubscriptionId(); 897 when(mSubscriptionManager.getActiveSubscriptionInfo(anyInt())).thenReturn(info); 898 899 int subId = mInternetDetailsContentController.getActiveAutoSwitchNonDdsSubId(); 900 assertThat(subId).isEqualTo(SubscriptionManager.INVALID_SUBSCRIPTION_ID); 901 } 902 903 @Test getActiveAutoSwitchNonDdsSubId_registerCallbackForExistedSubId_notRegister()904 public void getActiveAutoSwitchNonDdsSubId_registerCallbackForExistedSubId_notRegister() { 905 mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true); 906 907 // Adds non DDS subId 908 SubscriptionInfo info = mock(SubscriptionInfo.class); 909 doReturn(SUB_ID2).when(info).getSubscriptionId(); 910 doReturn(false).when(info).isOpportunistic(); 911 when(mSubscriptionManager.getActiveSubscriptionInfo(anyInt())).thenReturn(info); 912 913 mInternetDetailsContentController.getActiveAutoSwitchNonDdsSubId(); 914 915 // 1st time is onStart(), 2nd time is getActiveAutoSwitchNonDdsSubId() 916 verify(mTelephonyManager, times(2)).registerTelephonyCallback(any(), any()); 917 assertThat(mInternetDetailsContentController.mSubIdTelephonyCallbackMap.size()).isEqualTo( 918 2); 919 920 // Adds non DDS subId again 921 doReturn(SUB_ID2).when(info).getSubscriptionId(); 922 doReturn(false).when(info).isOpportunistic(); 923 when(mSubscriptionManager.getActiveSubscriptionInfo(anyInt())).thenReturn(info); 924 925 mInternetDetailsContentController.getActiveAutoSwitchNonDdsSubId(); 926 927 // Does not add due to cached subInfo in mSubIdTelephonyCallbackMap. 928 verify(mTelephonyManager, times(2)).registerTelephonyCallback(any(), any()); 929 assertThat(mInternetDetailsContentController.mSubIdTelephonyCallbackMap.size()).isEqualTo( 930 2); 931 } 932 933 @Test getMobileNetworkSummary()934 public void getMobileNetworkSummary() { 935 mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true); 936 Resources res1 = mock(Resources.class); 937 doReturn("EDGE").when(res1).getString(anyInt()); 938 Resources res2 = mock(Resources.class); 939 doReturn("LTE").when(res2).getString(anyInt()); 940 when(SubscriptionManager.getResourcesForSubId(any(), eq(SUB_ID))).thenReturn(res1); 941 when(SubscriptionManager.getResourcesForSubId(any(), eq(SUB_ID2))).thenReturn(res2); 942 943 InternetDetailsContentController spyController = spy(mInternetDetailsContentController); 944 Map<Integer, TelephonyDisplayInfo> mSubIdTelephonyDisplayInfoMap = 945 spyController.mSubIdTelephonyDisplayInfoMap; 946 TelephonyDisplayInfo info1 = new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_EDGE, 947 TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE); 948 TelephonyDisplayInfo info2 = new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_LTE, 949 TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE); 950 951 mSubIdTelephonyDisplayInfoMap.put(SUB_ID, info1); 952 mSubIdTelephonyDisplayInfoMap.put(SUB_ID2, info2); 953 954 doReturn(SUB_ID2).when(spyController).getActiveAutoSwitchNonDdsSubId(); 955 doReturn(true).when(spyController).isMobileDataEnabled(); 956 doReturn(true).when(spyController).activeNetworkIsCellular(); 957 String dds = spyController.getMobileNetworkSummary(SUB_ID); 958 String nonDds = spyController.getMobileNetworkSummary(SUB_ID2); 959 960 String ddsNetworkType = dds.split("/")[1]; 961 String nonDdsNetworkType = nonDds.split("/")[1]; 962 assertThat(dds).contains(mContext.getString(R.string.mobile_data_poor_connection)); 963 assertThat(ddsNetworkType).isNotEqualTo(nonDdsNetworkType); 964 } 965 966 @Test getMobileNetworkSummary_flagOff()967 public void getMobileNetworkSummary_flagOff() { 968 InternetDetailsContentController spyController = spy(mInternetDetailsContentController); 969 doReturn(true).when(spyController).isMobileDataEnabled(); 970 doReturn(true).when(spyController).activeNetworkIsCellular(); 971 String dds = spyController.getMobileNetworkSummary(SUB_ID); 972 973 assertThat(dds).contains(mContext.getString(R.string.mobile_data_connection_active)); 974 } 975 976 @Test launchMobileNetworkSettings_validSubId()977 public void launchMobileNetworkSettings_validSubId() { 978 mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true); 979 InternetDetailsContentController spyController = spy(mInternetDetailsContentController); 980 doReturn(SUB_ID2).when(spyController).getActiveAutoSwitchNonDdsSubId(); 981 spyController.launchMobileNetworkSettings(mDialogLaunchView); 982 983 verify(mActivityStarter).postStartActivityDismissingKeyguard(any(Intent.class), anyInt(), 984 any()); 985 } 986 987 @Test launchMobileNetworkSettings_invalidSubId()988 public void launchMobileNetworkSettings_invalidSubId() { 989 mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true); 990 InternetDetailsContentController spyController = spy(mInternetDetailsContentController); 991 doReturn(SubscriptionManager.INVALID_SUBSCRIPTION_ID) 992 .when(spyController).getActiveAutoSwitchNonDdsSubId(); 993 spyController.launchMobileNetworkSettings(mDialogLaunchView); 994 995 verify(mActivityStarter, never()) 996 .postStartActivityDismissingKeyguard(any(Intent.class), anyInt()); 997 } 998 999 @Test setAutoDataSwitchMobileDataPolicy()1000 public void setAutoDataSwitchMobileDataPolicy() { 1001 mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true); 1002 mInternetDetailsContentController.setAutoDataSwitchMobileDataPolicy(SUB_ID, true); 1003 1004 verify(mTelephonyManager).setMobileDataPolicyEnabled(eq( 1005 TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH), eq(true)); 1006 } 1007 1008 @Test getSignalStrengthDrawableWithLevel_carrierNetworkIsNotActive_useMobileDataLevel()1009 public void getSignalStrengthDrawableWithLevel_carrierNetworkIsNotActive_useMobileDataLevel() { 1010 // Fake mobile data level as SIGNAL_STRENGTH_POOR(1) 1011 when(mSignalStrength.getLevel()).thenReturn(SIGNAL_STRENGTH_POOR); 1012 // Fake carrier network level as WIFI_LEVEL_MAX(4) 1013 when(mInternetDetailsContentController.getCarrierNetworkLevel()).thenReturn(WIFI_LEVEL_MAX); 1014 1015 InternetDetailsContentController spyController = spy(mInternetDetailsContentController); 1016 spyController.getSignalStrengthDrawableWithLevel(false /* isCarrierNetworkActive */, 0); 1017 1018 verify(spyController).getSignalStrengthIcon(eq(0), any(), eq(SIGNAL_STRENGTH_POOR), 1019 eq(NUM_SIGNAL_STRENGTH_BINS), anyInt(), anyBoolean()); 1020 } 1021 1022 @Test getSignalStrengthDrawableWithLevel_carrierNetworkIsActive_useCarrierNetworkLevel()1023 public void getSignalStrengthDrawableWithLevel_carrierNetworkIsActive_useCarrierNetworkLevel() { 1024 // Fake mobile data level as SIGNAL_STRENGTH_POOR(1) 1025 when(mSignalStrength.getLevel()).thenReturn(SIGNAL_STRENGTH_POOR); 1026 // Fake carrier network level as WIFI_LEVEL_MAX(4) 1027 when(mInternetDetailsContentController.getCarrierNetworkLevel()).thenReturn(WIFI_LEVEL_MAX); 1028 1029 InternetDetailsContentController spyController = spy(mInternetDetailsContentController); 1030 spyController.getSignalStrengthDrawableWithLevel(true /* isCarrierNetworkActive */, 0); 1031 1032 verify(spyController).getSignalStrengthIcon(eq(0), any(), eq(WIFI_LEVEL_MAX), 1033 eq(WIFI_LEVEL_MAX + 1), anyInt(), anyBoolean()); 1034 } 1035 1036 @Test getCarrierNetworkLevel_mergedCarrierEntryIsNull_returnMinLevel()1037 public void getCarrierNetworkLevel_mergedCarrierEntryIsNull_returnMinLevel() { 1038 when(mAccessPointController.getMergedCarrierEntry()).thenReturn(null); 1039 1040 assertThat(mInternetDetailsContentController.getCarrierNetworkLevel()).isEqualTo( 1041 WIFI_LEVEL_MIN); 1042 } 1043 1044 @Test getCarrierNetworkLevel_getUnreachableLevel_returnMinLevel()1045 public void getCarrierNetworkLevel_getUnreachableLevel_returnMinLevel() { 1046 when(mMergedCarrierEntry.getLevel()).thenReturn(WIFI_LEVEL_UNREACHABLE); 1047 1048 assertThat(mInternetDetailsContentController.getCarrierNetworkLevel()).isEqualTo( 1049 WIFI_LEVEL_MIN); 1050 } 1051 1052 @Test getCarrierNetworkLevel_getAvailableLevel_returnSameLevel()1053 public void getCarrierNetworkLevel_getAvailableLevel_returnSameLevel() { 1054 for (int level = WIFI_LEVEL_MIN; level <= WIFI_LEVEL_MAX; level++) { 1055 when(mMergedCarrierEntry.getLevel()).thenReturn(level); 1056 1057 assertThat(mInternetDetailsContentController.getCarrierNetworkLevel()).isEqualTo(level); 1058 } 1059 } 1060 1061 @Test getMobileNetworkSummary_withCarrierNetworkChange()1062 public void getMobileNetworkSummary_withCarrierNetworkChange() { 1063 Resources res = mock(Resources.class); 1064 doReturn("Carrier network changing").when(res).getString(anyInt()); 1065 when(SubscriptionManager.getResourcesForSubId(any(), eq(SUB_ID))).thenReturn(res); 1066 InternetDetailsContentController spyController = spy(mInternetDetailsContentController); 1067 Map<Integer, TelephonyDisplayInfo> mSubIdTelephonyDisplayInfoMap = 1068 spyController.mSubIdTelephonyDisplayInfoMap; 1069 TelephonyDisplayInfo info = new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_LTE, 1070 TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE); 1071 1072 mSubIdTelephonyDisplayInfoMap.put(SUB_ID, info); 1073 doReturn(true).when(spyController).isMobileDataEnabled(); 1074 doReturn(true).when(spyController).activeNetworkIsCellular(); 1075 spyController.mCarrierNetworkChangeMode = true; 1076 String dds = spyController.getMobileNetworkSummary(SUB_ID); 1077 1078 assertThat(dds).contains(mContext.getString(com.android.settingslib.R.string.carrier_network_change_mode)); 1079 } 1080 1081 @Test getConfiguratorQrCodeGeneratorIntentOrNull_wifiNotShareable_returnNull()1082 public void getConfiguratorQrCodeGeneratorIntentOrNull_wifiNotShareable_returnNull() { 1083 mFlags.set(Flags.SHARE_WIFI_QS_BUTTON, true); 1084 when(mConnectedEntry.canShare()).thenReturn(false); 1085 assertThat(mInternetDetailsContentController.getConfiguratorQrCodeGeneratorIntentOrNull( 1086 mConnectedEntry)).isNull(); 1087 } 1088 @Test getConfiguratorQrCodeGeneratorIntentOrNull_flagOff_returnNull()1089 public void getConfiguratorQrCodeGeneratorIntentOrNull_flagOff_returnNull() { 1090 mFlags.set(Flags.SHARE_WIFI_QS_BUTTON, false); 1091 when(mConnectedEntry.canShare()).thenReturn(true); 1092 assertThat(mInternetDetailsContentController.getConfiguratorQrCodeGeneratorIntentOrNull( 1093 mConnectedEntry)).isNull(); 1094 } 1095 1096 @Test getConfiguratorQrCodeGeneratorIntentOrNull_configurationNull_returnNull()1097 public void getConfiguratorQrCodeGeneratorIntentOrNull_configurationNull_returnNull() { 1098 mFlags.set(Flags.SHARE_WIFI_QS_BUTTON, true); 1099 when(mConnectedEntry.canShare()).thenReturn(true); 1100 when(mConnectedEntry.getWifiConfiguration()).thenReturn(null); 1101 assertThat(mInternetDetailsContentController.getConfiguratorQrCodeGeneratorIntentOrNull( 1102 mConnectedEntry)).isNull(); 1103 } 1104 1105 @Test getConfiguratorQrCodeGeneratorIntentOrNull_wifiShareable()1106 public void getConfiguratorQrCodeGeneratorIntentOrNull_wifiShareable() { 1107 mFlags.set(Flags.SHARE_WIFI_QS_BUTTON, true); 1108 when(mConnectedEntry.canShare()).thenReturn(true); 1109 when(mConnectedEntry.getWifiConfiguration()).thenReturn(mWifiConfiguration); 1110 assertThat(mInternetDetailsContentController.getConfiguratorQrCodeGeneratorIntentOrNull( 1111 mConnectedEntry)).isNotNull(); 1112 } 1113 1114 @Test onStop_cleanUp()1115 public void onStop_cleanUp() { 1116 doReturn(SUB_ID).when(mTelephonyManager).getSubscriptionId(); 1117 assertThat( 1118 mInternetDetailsContentController.mSubIdTelephonyManagerMap.get(SUB_ID)).isEqualTo( 1119 mTelephonyManager); 1120 assertThat(mInternetDetailsContentController.mSubIdTelephonyCallbackMap.get( 1121 SUB_ID)).isNotNull(); 1122 assertThat(mInternetDetailsContentController.mCallback).isNotNull(); 1123 1124 mInternetDetailsContentController.onStop(); 1125 1126 verify(mTelephonyManager).unregisterTelephonyCallback(any(TelephonyCallback.class)); 1127 assertThat( 1128 mInternetDetailsContentController.mSubIdTelephonyDisplayInfoMap.isEmpty()).isTrue(); 1129 assertThat(mInternetDetailsContentController.mSubIdTelephonyManagerMap.isEmpty()).isTrue(); 1130 assertThat(mInternetDetailsContentController.mSubIdTelephonyCallbackMap.isEmpty()).isTrue(); 1131 verify(mSubscriptionManager).removeOnSubscriptionsChangedListener( 1132 mInternetDetailsContentController 1133 .mOnSubscriptionsChangedListener); 1134 verify(mAccessPointController).removeAccessPointCallback(mInternetDetailsContentController); 1135 verify(mConnectivityManager).unregisterNetworkCallback( 1136 any(ConnectivityManager.NetworkCallback.class)); 1137 assertThat(mInternetDetailsContentController.mCallback).isNull(); 1138 } 1139 1140 @Test hasActiveSubIdOnDds_noDds_returnFalse()1141 public void hasActiveSubIdOnDds_noDds_returnFalse() { 1142 when(SubscriptionManager.getDefaultDataSubscriptionId()) 1143 .thenReturn(SubscriptionManager.INVALID_SUBSCRIPTION_ID); 1144 1145 mInternetDetailsContentController.mOnSubscriptionsChangedListener.onSubscriptionsChanged(); 1146 1147 assertThat(mInternetDetailsContentController.hasActiveSubIdOnDds()).isFalse(); 1148 } 1149 1150 @Test hasActiveSubIdOnDds_activeDds_returnTrue()1151 public void hasActiveSubIdOnDds_activeDds_returnTrue() { 1152 mInternetDetailsContentController.mOnSubscriptionsChangedListener.onSubscriptionsChanged(); 1153 1154 assertThat(mInternetDetailsContentController.hasActiveSubIdOnDds()).isTrue(); 1155 } 1156 1157 @Test hasActiveSubIdOnDds_activeDdsAndHasProvisioning_returnFalse()1158 public void hasActiveSubIdOnDds_activeDdsAndHasProvisioning_returnFalse() { 1159 when(SubscriptionManager.getDefaultDataSubscriptionId()) 1160 .thenReturn(SUB_ID); 1161 SubscriptionInfo info = mock(SubscriptionInfo.class); 1162 when(info.isEmbedded()).thenReturn(true); 1163 when(info.getProfileClass()).thenReturn(PROFILE_CLASS_PROVISIONING); 1164 when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(info); 1165 1166 mInternetDetailsContentController.mOnSubscriptionsChangedListener.onSubscriptionsChanged(); 1167 1168 assertThat(mInternetDetailsContentController.hasActiveSubIdOnDds()).isFalse(); 1169 } 1170 1171 @Test hasActiveSubIdOnDds_activeDdsAndIsOnlyNonTerrestrialNetwork_returnFalse()1172 public void hasActiveSubIdOnDds_activeDdsAndIsOnlyNonTerrestrialNetwork_returnFalse() { 1173 when(SubscriptionManager.getDefaultDataSubscriptionId()) 1174 .thenReturn(SUB_ID); 1175 SubscriptionInfo info = mock(SubscriptionInfo.class); 1176 when(info.isEmbedded()).thenReturn(true); 1177 when(info.isOnlyNonTerrestrialNetwork()).thenReturn(true); 1178 when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(info); 1179 1180 mInternetDetailsContentController.mOnSubscriptionsChangedListener.onSubscriptionsChanged(); 1181 1182 assertFalse(mInternetDetailsContentController.hasActiveSubIdOnDds()); 1183 } 1184 1185 @Test hasActiveSubIdOnDds_activeDdsAndIsNotOnlyNonTerrestrialNetwork_returnTrue()1186 public void hasActiveSubIdOnDds_activeDdsAndIsNotOnlyNonTerrestrialNetwork_returnTrue() { 1187 when(SubscriptionManager.getDefaultDataSubscriptionId()) 1188 .thenReturn(SUB_ID); 1189 SubscriptionInfo info = mock(SubscriptionInfo.class); 1190 when(info.isEmbedded()).thenReturn(true); 1191 when(info.isOnlyNonTerrestrialNetwork()).thenReturn(false); 1192 when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(info); 1193 1194 mInternetDetailsContentController.mOnSubscriptionsChangedListener.onSubscriptionsChanged(); 1195 1196 assertTrue(mInternetDetailsContentController.hasActiveSubIdOnDds()); 1197 } 1198 getResourcesString(String name)1199 private String getResourcesString(String name) { 1200 return mContext.getResources().getString(getResourcesId(name)); 1201 } 1202 getResourcesId(String name)1203 private int getResourcesId(String name) { 1204 return mContext.getResources().getIdentifier(name, "string", 1205 mContext.getPackageName()); 1206 } 1207 fakeAirplaneModeEnabled(boolean enabled)1208 private void fakeAirplaneModeEnabled(boolean enabled) { 1209 when(mGlobalSettings.getInt(eq(AIRPLANE_MODE_ON), anyInt())).thenReturn(enabled ? 1 : 0); 1210 } 1211 } 1212