• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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