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