1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.datausage;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.mockito.ArgumentMatchers.any;
22 import static org.mockito.Mockito.doNothing;
23 import static org.mockito.Mockito.doReturn;
24 import static org.mockito.Mockito.spy;
25 import static org.mockito.Mockito.verify;
26 import static org.mockito.Mockito.when;
27 
28 import android.content.Context;
29 import android.content.Intent;
30 import android.content.res.Resources;
31 import android.graphics.Typeface;
32 import android.net.ConnectivityManager;
33 import android.net.NetworkTemplate;
34 import android.os.Bundle;
35 import android.telephony.SubscriptionManager;
36 import android.view.LayoutInflater;
37 import android.view.View;
38 import android.view.View.MeasureSpec;
39 import android.widget.TextView;
40 
41 import androidx.preference.PreferenceViewHolder;
42 import androidx.test.annotation.UiThreadTest;
43 import androidx.test.core.app.ApplicationProvider;
44 import androidx.test.ext.junit.runners.AndroidJUnit4;
45 
46 import com.android.settings.SettingsActivity;
47 import com.android.settings.testutils.ResourcesUtils;
48 import com.android.settingslib.Utils;
49 
50 import org.junit.Before;
51 import org.junit.Test;
52 import org.junit.runner.RunWith;
53 import org.mockito.ArgumentCaptor;
54 import org.mockito.MockitoAnnotations;
55 
56 import java.util.concurrent.TimeUnit;
57 
58 @RunWith(AndroidJUnit4.class)
59 public class DataUsageSummaryPreferenceTest {
60 
61     private static final long CYCLE_DURATION_MILLIS = 1000000000L;
62     private static final long UPDATE_LAG_MILLIS = 10000000L;
63     private static final String FAKE_CARRIER = "z-mobile";
64 
65     private Context mContext;
66     private Resources mResources;
67     private PreferenceViewHolder mHolder;
68     private DataUsageSummaryPreference mSummaryPreference;
69 
70     private long mCycleEnd;
71     private long mUpdateTime;
72 
73 
74     @Before
setUp()75     public void setUp() {
76         MockitoAnnotations.initMocks(this);
77         mContext = spy(ApplicationProvider.getApplicationContext());
78         mResources = spy(mContext.getResources());
79         when(mContext.getResources()).thenReturn(mResources);
80         mSummaryPreference = spy(new DataUsageSummaryPreference(mContext, null /* attrs */));
81         LayoutInflater inflater = mContext.getSystemService(LayoutInflater.class);
82         View view = inflater.inflate(
83                 mSummaryPreference.getLayoutResource(),
84                 null /* root */, false /* attachToRoot */);
85 
86         mHolder = spy(PreferenceViewHolder.createInstanceForTests(view));
87         assertThat(mSummaryPreference.getDataUsed(mHolder)).isNotNull();
88 
89         final long now = System.currentTimeMillis();
90         mCycleEnd = now + CYCLE_DURATION_MILLIS;
91         mUpdateTime = now - UPDATE_LAG_MILLIS;
92     }
93 
94     @UiThreadTest
95     @Test
testSetUsageInfo_withLaunchIntent_launchButtonShown()96     public void testSetUsageInfo_withLaunchIntent_launchButtonShown() {
97         mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
98                 new Intent());
99 
100         mSummaryPreference.onBindViewHolder(mHolder);
101         assertThat(mSummaryPreference.getLaunchButton(mHolder).getVisibility())
102                 .isEqualTo(View.VISIBLE);
103     }
104 
105     @Test
testSetUsageInfo_withoutLaunchIntent_launchButtonNotShown()106     public void testSetUsageInfo_withoutLaunchIntent_launchButtonNotShown() {
107         mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
108                 null /* launchIntent */);
109 
110         mSummaryPreference.onBindViewHolder(mHolder);
111         assertThat(mSummaryPreference.getLaunchButton(mHolder).getVisibility())
112                 .isEqualTo(View.GONE);
113     }
114 
115     @Test
testSetUsageInfo_withDataPlans_carrierInfoShown()116     public void testSetUsageInfo_withDataPlans_carrierInfoShown() {
117         mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 1 /* numPlans */,
118                 new Intent());
119 
120         mSummaryPreference.onBindViewHolder(mHolder);
121         assertThat(mSummaryPreference.getCarrierInfo(mHolder).getVisibility())
122                 .isEqualTo(View.VISIBLE);
123     }
124 
125     @Test
testSetUsageInfo_withNoDataPlans_carrierInfoNotShown()126     public void testSetUsageInfo_withNoDataPlans_carrierInfoNotShown() {
127         mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
128                 new Intent());
129 
130         mSummaryPreference.onBindViewHolder(mHolder);
131         assertThat(mSummaryPreference.getCarrierInfo(mHolder).getVisibility())
132                 .isEqualTo(View.GONE);
133     }
134 
135     @Test
testCarrierUpdateTime_shouldFormatDaysCorrectly()136     public void testCarrierUpdateTime_shouldFormatDaysCorrectly() {
137         int baseUnit = 2;
138         int smudge = 6;
139         final long updateTime = System.currentTimeMillis()
140                 - TimeUnit.DAYS.toMillis(baseUnit) - TimeUnit.HOURS.toMillis(smudge);
141         mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
142                 new Intent());
143 
144         mSummaryPreference.onBindViewHolder(mHolder);
145         assertThat(mSummaryPreference.getCarrierInfo(mHolder).getText().toString())
146                 .isEqualTo("Updated by " + FAKE_CARRIER + " " + baseUnit + " days ago");
147     }
148 
149     @Test
testCarrierUpdateTime_shouldFormatHoursCorrectly()150     public void testCarrierUpdateTime_shouldFormatHoursCorrectly() {
151         int baseUnit = 2;
152         int smudge = 6;
153         final long updateTime = System.currentTimeMillis()
154                 - TimeUnit.HOURS.toMillis(baseUnit) - TimeUnit.MINUTES.toMillis(smudge);
155         mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
156                 new Intent());
157 
158         mSummaryPreference.onBindViewHolder(mHolder);
159         assertThat(mSummaryPreference.getCarrierInfo(mHolder).getText().toString())
160                 .isEqualTo("Updated by " + FAKE_CARRIER + " " + baseUnit + " hr ago");
161     }
162 
163     @Test
testCarrierUpdateTime_shouldFormatMinutesCorrectly()164     public void testCarrierUpdateTime_shouldFormatMinutesCorrectly() {
165         int baseUnit = 2;
166         int smudge = 6;
167         final long updateTime = System.currentTimeMillis()
168                 - TimeUnit.MINUTES.toMillis(baseUnit) - TimeUnit.SECONDS.toMillis(smudge);
169         mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
170                 new Intent());
171 
172         mSummaryPreference.onBindViewHolder(mHolder);
173         assertThat(mSummaryPreference.getCarrierInfo(mHolder).getText().toString())
174                 .isEqualTo("Updated by " + FAKE_CARRIER + " " + baseUnit + " min ago");
175     }
176 
177     @Test
testCarrierUpdateTime_shouldFormatLessThanMinuteCorrectly()178     public void testCarrierUpdateTime_shouldFormatLessThanMinuteCorrectly() {
179         final long updateTime = System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(45);
180         mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
181                 new Intent());
182 
183         mSummaryPreference.onBindViewHolder(mHolder);
184         assertThat(mSummaryPreference.getCarrierInfo(mHolder).getText().toString())
185                 .isEqualTo("Updated by " + FAKE_CARRIER + " just now");
186     }
187 
188     @Test
testCarrierUpdateTimeWithNoCarrier_shouldSayJustNow()189     public void testCarrierUpdateTimeWithNoCarrier_shouldSayJustNow() {
190         final long updateTime = System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(45);
191         mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, null /* carrier */,
192                 1 /* numPlans */, new Intent());
193 
194         mSummaryPreference.onBindViewHolder(mHolder);
195         assertThat(mSummaryPreference.getCarrierInfo(mHolder).getText().toString())
196                 .isEqualTo("Updated just now");
197     }
198 
199     @Test
testCarrierUpdateTimeWithNoCarrier_shouldFormatTime()200     public void testCarrierUpdateTimeWithNoCarrier_shouldFormatTime() {
201         final long updateTime = System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(2);
202         mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, null /* carrier */,
203                 1 /* numPlans */, new Intent());
204 
205         mSummaryPreference.onBindViewHolder(mHolder);
206         assertThat(mSummaryPreference.getCarrierInfo(mHolder).getText().toString())
207                 .isEqualTo("Updated 2 min ago");
208     }
209 
210     @Test
setUsageInfo_withRecentCarrierUpdate_doesNotSetCarrierInfoWarningColorAndFont()211     public void setUsageInfo_withRecentCarrierUpdate_doesNotSetCarrierInfoWarningColorAndFont() {
212         final long updateTime = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1);
213         mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
214                 new Intent());
215 
216         mSummaryPreference.onBindViewHolder(mHolder);
217         TextView carrierInfo = mSummaryPreference.getCarrierInfo(mHolder);
218         assertThat(carrierInfo.getVisibility()).isEqualTo(View.VISIBLE);
219         assertThat(carrierInfo.getCurrentTextColor()).isEqualTo(
220                 Utils.getColorAttrDefaultColor(mContext, android.R.attr.textColorSecondary));
221         assertThat(carrierInfo.getTypeface()).isEqualTo(Typeface.SANS_SERIF);
222     }
223 
224     @Test
testSetUsageInfo_withStaleCarrierUpdate_setsCarrierInfoWarningColorAndFont()225     public void testSetUsageInfo_withStaleCarrierUpdate_setsCarrierInfoWarningColorAndFont() {
226         final long updateTime = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(7);
227         mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, FAKE_CARRIER, 1 /* numPlans */,
228                 new Intent());
229 
230         mSummaryPreference.onBindViewHolder(mHolder);
231         TextView carrierInfo = mSummaryPreference.getCarrierInfo(mHolder);
232         assertThat(carrierInfo.getVisibility()).isEqualTo(View.VISIBLE);
233         assertThat(carrierInfo.getCurrentTextColor()).isEqualTo(
234                 Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorError));
235         assertThat(carrierInfo.getTypeface()).isEqualTo(
236                 DataUsageSummaryPreference.SANS_SERIF_MEDIUM);
237     }
238 
239     @Test
testSetUsageInfo_withNoDataPlans_usageTitleNotShown()240     public void testSetUsageInfo_withNoDataPlans_usageTitleNotShown() {
241         mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
242                 new Intent());
243 
244         mSummaryPreference.onBindViewHolder(mHolder);
245         assertThat(mSummaryPreference.getUsageTitle(mHolder).getVisibility()).isEqualTo(View.GONE);
246     }
247 
248     @Test
testSetUsageInfo_withMultipleDataPlans_usageTitleShown()249     public void testSetUsageInfo_withMultipleDataPlans_usageTitleShown() {
250         mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 2 /* numPlans */,
251                 new Intent());
252 
253         mSummaryPreference.onBindViewHolder(mHolder);
254         assertThat(mSummaryPreference.getUsageTitle(mHolder).getVisibility())
255                 .isEqualTo(View.VISIBLE);
256     }
257 
258     @Test
testSetUsageInfo_cycleRemainingTimeIsLessOneDay()259     public void testSetUsageInfo_cycleRemainingTimeIsLessOneDay() {
260         // just under one day
261         final long cycleEnd = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(23);
262         mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
263                 new Intent());
264 
265         mSummaryPreference.onBindViewHolder(mHolder);
266         assertThat(mSummaryPreference.getCycleTime(mHolder).getVisibility())
267                 .isEqualTo(View.VISIBLE);
268         assertThat(mSummaryPreference.getCycleTime(mHolder).getText()).isEqualTo(
269                 ResourcesUtils.getResourcesString(
270                         mContext, "billing_cycle_less_than_one_day_left"));
271     }
272 
273     @Test
testSetUsageInfo_cycleRemainingTimeNegativeDaysLeft_shouldDisplayNoneLeft()274     public void testSetUsageInfo_cycleRemainingTimeNegativeDaysLeft_shouldDisplayNoneLeft() {
275         final long cycleEnd = System.currentTimeMillis() - 1L;
276         mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
277                 new Intent());
278 
279         mSummaryPreference.onBindViewHolder(mHolder);
280         assertThat(mSummaryPreference.getCycleTime(mHolder).getVisibility())
281                 .isEqualTo(View.VISIBLE);
282         assertThat(mSummaryPreference.getCycleTime(mHolder).getText()).isEqualTo(
283                 ResourcesUtils.getResourcesString(mContext, "billing_cycle_none_left"));
284     }
285 
286     @Test
testSetUsageInfo_cycleRemainingTimeDaysLeft_shouldUsePlurals()287     public void testSetUsageInfo_cycleRemainingTimeDaysLeft_shouldUsePlurals() {
288         final int daysLeft = 3;
289         final long cycleEnd = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(daysLeft)
290                 + TimeUnit.HOURS.toMillis(1);
291         mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
292                 new Intent());
293 
294         mSummaryPreference.onBindViewHolder(mHolder);
295         assertThat(mSummaryPreference.getCycleTime(mHolder).getVisibility())
296                 .isEqualTo(View.VISIBLE);
297         assertThat(mSummaryPreference.getCycleTime(mHolder).getText())
298                 .isEqualTo(daysLeft + " days left");
299     }
300 
301     @Test
testSetLimitInfo_withLimitInfo_dataLimitsShown()302     public void testSetLimitInfo_withLimitInfo_dataLimitsShown() {
303         final String limitText = "test limit text";
304         mSummaryPreference.setLimitInfo(limitText);
305 
306         mSummaryPreference.onBindViewHolder(mHolder);
307         assertThat(mSummaryPreference.getDataLimits(mHolder).getVisibility())
308                 .isEqualTo(View.VISIBLE);
309         assertThat(mSummaryPreference.getDataLimits(mHolder).getText()).isEqualTo(limitText);
310     }
311 
312     @Test
testSetLimitInfo_withNullLimitInfo_dataLimitsNotShown()313     public void testSetLimitInfo_withNullLimitInfo_dataLimitsNotShown() {
314         mSummaryPreference.setLimitInfo(null);
315 
316         mSummaryPreference.onBindViewHolder(mHolder);
317         assertThat(mSummaryPreference.getDataLimits(mHolder).getVisibility()).isEqualTo(View.GONE);
318     }
319 
320     @Test
testSetLimitInfo_withEmptyLimitInfo_dataLimitsNotShown()321     public void testSetLimitInfo_withEmptyLimitInfo_dataLimitsNotShown() {
322         final String emptyLimitText = "";
323         mSummaryPreference.setLimitInfo(emptyLimitText);
324 
325         mSummaryPreference.onBindViewHolder(mHolder);
326         assertThat(mSummaryPreference.getDataLimits(mHolder).getVisibility()).isEqualTo(View.GONE);
327     }
328 
329     @Test
testSetChartEnabledFalse_hidesLabelBar()330     public void testSetChartEnabledFalse_hidesLabelBar() {
331         setValidLabels();
332         mSummaryPreference.setChartEnabled(false);
333 
334         mSummaryPreference.onBindViewHolder(mHolder);
335         assertThat(mSummaryPreference.getLabelBar(mHolder).getVisibility()).isEqualTo(View.GONE);
336         assertThat(mSummaryPreference.getProgressBar(mHolder).getVisibility()).isEqualTo(View.GONE);
337     }
338 
339     @Test
testSetEmptyLabels_hidesLabelBar()340     public void testSetEmptyLabels_hidesLabelBar() {
341         mSummaryPreference.setLabels("", "");
342 
343         mSummaryPreference.onBindViewHolder(mHolder);
344         assertThat(mSummaryPreference.getLabelBar(mHolder).getVisibility()).isEqualTo(View.GONE);
345         assertThat(mSummaryPreference.getProgressBar(mHolder).getVisibility()).isEqualTo(View.GONE);
346     }
347 
348     @Test
testLabelBar_isVisible_whenLabelsSet()349     public void testLabelBar_isVisible_whenLabelsSet() {
350         setValidLabels();
351         //mChartEnabled defaults to true
352 
353         mSummaryPreference.onBindViewHolder(mHolder);
354         assertThat(mSummaryPreference.getLabelBar(mHolder).getVisibility())
355                 .isEqualTo(View.VISIBLE);
356         assertThat(mSummaryPreference.getProgressBar(mHolder).getVisibility())
357                 .isEqualTo(View.VISIBLE);
358     }
359 
360     @Test
testSetProgress_updatesProgressBar()361     public void testSetProgress_updatesProgressBar() {
362         setValidLabels();
363         mSummaryPreference.setProgress(.5f);
364 
365         mSummaryPreference.onBindViewHolder(mHolder);
366         assertThat(mSummaryPreference.getProgressBar(mHolder).getProgress()).isEqualTo(50);
367     }
368 
setValidLabels()369     private void setValidLabels() {
370         mSummaryPreference.setLabels("0.0 GB", "5.0 GB");
371     }
372 
373     @Test
testSetUsageAndRemainingInfo_withUsageInfo_dataUsageAndRemainingShown()374     public void testSetUsageAndRemainingInfo_withUsageInfo_dataUsageAndRemainingShown() {
375         mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 1 /* numPlans */,
376                 new Intent());
377         mSummaryPreference.setUsageNumbers(
378                 BillingCycleSettings.MIB_IN_BYTES,
379                 10 * BillingCycleSettings.MIB_IN_BYTES,
380                 true /* hasMobileData */);
381 
382         mSummaryPreference.onBindViewHolder(mHolder);
383         assertThat(mSummaryPreference.getDataUsed(mHolder).getText().toString())
384                 .isEqualTo("1.00 MB used");
385         assertThat(mSummaryPreference.getDataRemaining(mHolder).getText().toString())
386                 .isEqualTo("9.00 MB left");
387         assertThat(mSummaryPreference.getDataRemaining(mHolder).getVisibility())
388                 .isEqualTo(View.VISIBLE);
389         final int colorId = Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorAccent);
390         assertThat(mSummaryPreference.getDataRemaining(mHolder).getCurrentTextColor())
391                 .isEqualTo(colorId);
392     }
393 
394     @Test
testSetUsageInfo_withDataOverusage()395     public void testSetUsageInfo_withDataOverusage() {
396         mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 1 /* numPlans */,
397                 new Intent());
398         mSummaryPreference.setUsageNumbers(
399                 11 * BillingCycleSettings.MIB_IN_BYTES,
400                 10 * BillingCycleSettings.MIB_IN_BYTES,
401                 true /* hasMobileData */);
402 
403         mSummaryPreference.onBindViewHolder(mHolder);
404         assertThat(mSummaryPreference.getDataUsed(mHolder).getText().toString())
405                 .isEqualTo("11.00 MB used");
406         assertThat(mSummaryPreference.getDataRemaining(mHolder).getText().toString())
407                 .isEqualTo("1.00 MB over");
408         final int colorId = Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorError);
409         assertThat(mSummaryPreference.getDataRemaining(mHolder).getCurrentTextColor())
410                 .isEqualTo(colorId);
411     }
412 
413     @Test
testSetUsageInfo_withUsageInfo_dataUsageShown()414     public void testSetUsageInfo_withUsageInfo_dataUsageShown() {
415         mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
416                 new Intent());
417         mSummaryPreference.setUsageNumbers(
418                 BillingCycleSettings.MIB_IN_BYTES, -1L, true /* hasMobileData */);
419 
420         mSummaryPreference.onBindViewHolder(mHolder);
421         assertThat(mSummaryPreference.getDataUsed(mHolder).getText().toString())
422                 .isEqualTo("1.00 MB used");
423         assertThat(mSummaryPreference.getDataRemaining(mHolder).getText()).isEqualTo("");
424     }
425 
426     @Test
testSetAppIntent_toMdpApp_intentCorrect()427     public void testSetAppIntent_toMdpApp_intentCorrect() {
428         final Intent intent = new Intent(SubscriptionManager.ACTION_MANAGE_SUBSCRIPTION_PLANS);
429         intent.setPackage("test-owner.example.com");
430         intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, 42);
431 
432         mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
433                 intent);
434 
435         mSummaryPreference.onBindViewHolder(mHolder);
436         assertThat(mSummaryPreference.getLaunchButton(mHolder).getVisibility())
437                 .isEqualTo(View.VISIBLE);
438         assertThat(mSummaryPreference.getLaunchButton(mHolder).getText())
439                 .isEqualTo(ResourcesUtils.getResourcesString(mContext, "launch_mdp_app_text"));
440 
441         doNothing().when(mContext).startActivity(any(Intent.class));
442         mSummaryPreference.getLaunchButton(mHolder).callOnClick();
443         final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(
444                 Intent.class);
445         verify(mContext).startActivity(intentCaptor.capture());
446         final Intent startedIntent = intentCaptor.getValue();
447 
448         assertThat(startedIntent.getAction())
449                 .isEqualTo(SubscriptionManager.ACTION_MANAGE_SUBSCRIPTION_PLANS);
450         assertThat(startedIntent.getPackage()).isEqualTo("test-owner.example.com");
451         assertThat(startedIntent.getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, -1))
452                 .isEqualTo(42);
453     }
454 
455     @Test
testSetUsageInfo_withOverflowStrings_dataRemainingNotShown()456     public void testSetUsageInfo_withOverflowStrings_dataRemainingNotShown() {
457         LayoutInflater inflater = LayoutInflater.from(mContext);
458         View view = inflater.inflate(mSummaryPreference.getLayoutResource(), null /* root */,
459                 false /* attachToRoot */);
460 
461         mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, FAKE_CARRIER, 1 /* numPlans */,
462                 new Intent());
463         mSummaryPreference.setUsageNumbers(
464                 BillingCycleSettings.MIB_IN_BYTES,
465                 10 * BillingCycleSettings.MIB_IN_BYTES,
466                 true /* hasMobileData */);
467 
468         int data_used_formatted_id = ResourcesUtils.getResourcesId(
469                 mContext, "string", "data_used_formatted");
470         int data_remaining_id = ResourcesUtils.getResourcesId(
471                 mContext, "string", "data_remaining");
472         CharSequence data_used_formatted_cs = "^1 ^2 used with long trailing text";
473         CharSequence data_remaining_cs = "^1 left";
474         doReturn(data_used_formatted_cs).when(mResources).getText(data_used_formatted_id);
475         doReturn(data_remaining_cs).when(mResources).getText(data_remaining_id);
476 
477         mSummaryPreference.onBindViewHolder(mHolder);
478 
479         TextView dataUsed = mSummaryPreference.getDataUsed(mHolder);
480         TextView dataRemaining = mSummaryPreference.getDataRemaining(mHolder);
481         int width = MeasureSpec.makeMeasureSpec(500, MeasureSpec.EXACTLY);
482         dataUsed.measure(width, MeasureSpec.UNSPECIFIED);
483         dataRemaining.measure(width, MeasureSpec.UNSPECIFIED);
484 
485         assertThat(dataRemaining.getVisibility()).isEqualTo(View.VISIBLE);
486 
487         MeasurableLinearLayout layout = mSummaryPreference.getLayout(mHolder);
488         layout.measure(
489                 MeasureSpec.makeMeasureSpec(800, View.MeasureSpec.EXACTLY),
490                 MeasureSpec.makeMeasureSpec(1000, View.MeasureSpec.EXACTLY));
491 
492         assertThat(dataUsed.getText().toString()).isEqualTo("1.00 MB used with long trailing text");
493         // TODO(b/175389659): re-enable this line once cuttlefish device specs are verified.
494         // assertThat(dataRemaining.getVisibility()).isEqualTo(View.GONE);
495     }
496 
497     @Test
testSetWifiMode_withUsageInfo_dataUsageShown()498     public void testSetWifiMode_withUsageInfo_dataUsageShown() {
499         final int daysLeft = 3;
500         final long cycleEnd = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(daysLeft)
501                 + TimeUnit.HOURS.toMillis(1);
502         mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, FAKE_CARRIER, 0 /* numPlans */,
503                 new Intent());
504         mSummaryPreference.setUsageNumbers(1000000L, -1L, true);
505         final String cycleText = "The quick fox";
506         mSummaryPreference.setWifiMode(true /* isWifiMode */, cycleText, false /* isSingleWifi */);
507         doReturn(200L).when(mSummaryPreference).getHistoricalUsageLevel();
508 
509         mSummaryPreference.onBindViewHolder(mHolder);
510         assertThat(mSummaryPreference.getUsageTitle(mHolder).getText().toString())
511                 .isEqualTo(ResourcesUtils.getResourcesString(mContext, "data_usage_wifi_title"));
512         assertThat(mSummaryPreference.getUsageTitle(mHolder).getVisibility())
513                 .isEqualTo(View.VISIBLE);
514         assertThat(mSummaryPreference.getCycleTime(mHolder).getVisibility())
515                 .isEqualTo(View.VISIBLE);
516         assertThat(mSummaryPreference.getCycleTime(mHolder).getText()).isEqualTo(cycleText);
517         assertThat(mSummaryPreference.getCarrierInfo(mHolder).getVisibility()).isEqualTo(View.GONE);
518         assertThat(mSummaryPreference.getDataLimits(mHolder).getVisibility()).isEqualTo(View.GONE);
519         assertThat(mSummaryPreference.getLaunchButton(mHolder).getVisibility())
520                 .isEqualTo(View.VISIBLE);
521         assertThat(mSummaryPreference.getLaunchButton(mHolder).getText())
522                 .isEqualTo(ResourcesUtils.getResourcesString(mContext, "launch_wifi_text"));
523 
524         doNothing().when(mContext).startActivity(any(Intent.class));
525         mSummaryPreference.getLaunchButton(mHolder).callOnClick();
526 
527         final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(
528                 Intent.class);
529         verify(mContext).startActivity(intentCaptor.capture());
530         final Intent startedIntent = intentCaptor.getValue();
531 
532         final Bundle expect = new Bundle(1);
533         expect.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE,
534                 NetworkTemplate.buildTemplateWifi(NetworkTemplate.WIFI_NETWORKID_ALL,
535                 null /* subscriberId */));
536         final Bundle actual = startedIntent
537                 .getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
538         assertThat((NetworkTemplate) actual.getParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE))
539                 .isEqualTo(NetworkTemplate.buildTemplateWifi(
540                 NetworkTemplate.WIFI_NETWORKID_ALL, null /* subscriberId */));
541 
542         assertThat(startedIntent.getIntExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, 0))
543                 .isEqualTo(ResourcesUtils.getResourcesId(mContext, "string", "wifi_data_usage"));
544     }
545 
546     @UiThreadTest
547     @Test
testSetWifiMode_noUsageInfo_shouldDisableLaunchButton()548     public void testSetWifiMode_noUsageInfo_shouldDisableLaunchButton() {
549         mSummaryPreference.setWifiMode(true /* isWifiMode */, "Test cycle text",
550                 false /* isSingleWifi */);
551         doReturn(0L).when(mSummaryPreference).getHistoricalUsageLevel();
552 
553         mSummaryPreference.onBindViewHolder(mHolder);
554 
555         assertThat(mSummaryPreference.getLaunchButton(mHolder).isEnabled()).isFalse();
556     }
557 
558     @Test
launchWifiDataUsage_shouldSetWifiNetworkTypeInIntentExtra()559     public void launchWifiDataUsage_shouldSetWifiNetworkTypeInIntentExtra() {
560         doNothing().when(mContext).startActivity(any(Intent.class));
561         mSummaryPreference.launchWifiDataUsage(mContext);
562 
563         final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(
564                 Intent.class);
565         verify(mContext).startActivity(intentCaptor.capture());
566         final Intent launchIntent = intentCaptor.getValue();
567         final Bundle args =
568                 launchIntent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
569 
570         assertThat(args.getInt(DataUsageList.EXTRA_NETWORK_TYPE))
571             .isEqualTo(ConnectivityManager.TYPE_WIFI);
572     }
573 }
574