1 /* 2 * Copyright (C) 2018 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 import static org.mockito.Mockito.doReturn; 21 import static org.mockito.Mockito.mock; 22 import static org.mockito.Mockito.spy; 23 import static org.mockito.Mockito.when; 24 25 import android.app.Activity; 26 import android.content.ComponentName; 27 import android.content.Context; 28 import android.content.Intent; 29 import android.graphics.Typeface; 30 import android.net.NetworkTemplate; 31 import android.os.Bundle; 32 import android.support.v7.preference.PreferenceViewHolder; 33 import android.telephony.SubscriptionManager; 34 import android.view.LayoutInflater; 35 import android.view.View; 36 import android.widget.Button; 37 import android.widget.LinearLayout; 38 import android.widget.ProgressBar; 39 import android.widget.TextView; 40 41 import com.android.settings.R; 42 import com.android.settings.SettingsActivity; 43 import com.android.settings.SubSettings; 44 import com.android.settings.testutils.SettingsRobolectricTestRunner; 45 import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; 46 import com.android.settingslib.Utils; 47 48 import org.junit.Before; 49 import org.junit.Test; 50 import org.junit.runner.RunWith; 51 import org.mockito.MockitoAnnotations; 52 import org.robolectric.Robolectric; 53 import org.robolectric.RuntimeEnvironment; 54 import org.robolectric.Shadows; 55 import org.robolectric.annotation.Config; 56 import org.robolectric.shadows.ShadowActivity; 57 58 import java.util.concurrent.TimeUnit; 59 60 @RunWith(SettingsRobolectricTestRunner.class) 61 @Config(shadows = SettingsShadowResourcesImpl.class) 62 public class DataUsageSummaryPreferenceTest { 63 64 private static final long CYCLE_DURATION_MILLIS = 1000000000L; 65 private static final long UPDATE_LAG_MILLIS = 10000000L; 66 private static final String DUMMY_CARRIER = "z-mobile"; 67 68 private Context mContext; 69 private PreferenceViewHolder mHolder; 70 private DataUsageSummaryPreference mSummaryPreference; 71 private TextView mUsageTitle; 72 private TextView mCycleTime; 73 private TextView mCarrierInfo; 74 private TextView mDataLimits; 75 private TextView mDataUsed; 76 private TextView mDataRemaining; 77 private Button mLaunchButton; 78 private LinearLayout mLabelBar; 79 private TextView mLabel1; 80 private TextView mLabel2; 81 private ProgressBar mProgressBar; 82 83 private long mCycleEnd; 84 private long mUpdateTime; 85 86 @Before setUp()87 public void setUp() { 88 MockitoAnnotations.initMocks(this); 89 mContext = spy(RuntimeEnvironment.application); 90 mSummaryPreference = new DataUsageSummaryPreference(mContext, null /* attrs */); 91 LayoutInflater inflater = LayoutInflater.from(mContext); 92 View view = inflater.inflate(mSummaryPreference.getLayoutResource(), null /* root */, 93 false /* attachToRoot */); 94 95 mHolder = spy(PreferenceViewHolder.createInstanceForTests(view)); 96 97 final long now = System.currentTimeMillis(); 98 mCycleEnd = now + CYCLE_DURATION_MILLIS; 99 mUpdateTime = now - UPDATE_LAG_MILLIS; 100 } 101 102 @Test testSetUsageInfo_withLaunchIntent_launchButtonShown()103 public void testSetUsageInfo_withLaunchIntent_launchButtonShown() { 104 mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */, 105 new Intent()); 106 107 bindViewHolder(); 108 assertThat(mLaunchButton.getVisibility()).isEqualTo(View.VISIBLE); 109 } 110 111 @Test testSetUsageInfo_withoutLaunchIntent_launchButtonNotShown()112 public void testSetUsageInfo_withoutLaunchIntent_launchButtonNotShown() { 113 mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */, 114 null /* launchIntent */); 115 116 bindViewHolder(); 117 assertThat(mLaunchButton.getVisibility()).isEqualTo(View.GONE); 118 } 119 120 @Test testSetUsageInfo_withDataPlans_carrierInfoShown()121 public void testSetUsageInfo_withDataPlans_carrierInfoShown() { 122 mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 1 /* numPlans */, 123 new Intent()); 124 125 bindViewHolder(); 126 assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.VISIBLE); 127 } 128 129 @Test testSetUsageInfo_withNoDataPlans_carrierInfoNotShown()130 public void testSetUsageInfo_withNoDataPlans_carrierInfoNotShown() { 131 mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */, 132 new Intent()); 133 134 bindViewHolder(); 135 assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.GONE); 136 } 137 138 @Test testCarrierUpdateTime_shouldFormatDaysCorrectly()139 public void testCarrierUpdateTime_shouldFormatDaysCorrectly() { 140 int baseUnit = 2; 141 int smudge = 6; 142 final long updateTime = System.currentTimeMillis() 143 - TimeUnit.DAYS.toMillis(baseUnit) - TimeUnit.HOURS.toMillis(smudge); 144 mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update); 145 mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, DUMMY_CARRIER, 1 /* numPlans */, 146 new Intent()); 147 148 bindViewHolder(); 149 assertThat(mCarrierInfo.getText().toString()) 150 .isEqualTo("Updated by " + DUMMY_CARRIER + " " + baseUnit + " days ago"); 151 } 152 153 @Test testCarrierUpdateTime_shouldFormatHoursCorrectly()154 public void testCarrierUpdateTime_shouldFormatHoursCorrectly() { 155 int baseUnit = 2; 156 int smudge = 6; 157 final long updateTime = System.currentTimeMillis() 158 - TimeUnit.HOURS.toMillis(baseUnit) - TimeUnit.MINUTES.toMillis(smudge); 159 mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update); 160 mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, DUMMY_CARRIER, 1 /* numPlans */, 161 new Intent()); 162 163 bindViewHolder(); 164 assertThat(mCarrierInfo.getText().toString()) 165 .isEqualTo("Updated by " + DUMMY_CARRIER + " " + baseUnit + " hr ago"); 166 } 167 168 @Test testCarrierUpdateTime_shouldFormatMinutesCorrectly()169 public void testCarrierUpdateTime_shouldFormatMinutesCorrectly() { 170 int baseUnit = 2; 171 int smudge = 6; 172 final long updateTime = System.currentTimeMillis() 173 - TimeUnit.MINUTES.toMillis(baseUnit) - TimeUnit.SECONDS.toMillis(smudge); 174 mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update); 175 mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, DUMMY_CARRIER, 1 /* numPlans */, 176 new Intent()); 177 178 bindViewHolder(); 179 assertThat(mCarrierInfo.getText().toString()) 180 .isEqualTo("Updated by " + DUMMY_CARRIER + " " + baseUnit + " min ago"); 181 } 182 183 @Test testCarrierUpdateTime_shouldFormatLessThanMinuteCorrectly()184 public void testCarrierUpdateTime_shouldFormatLessThanMinuteCorrectly() { 185 final long updateTime = System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(45); 186 mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update); 187 mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, DUMMY_CARRIER, 1 /* numPlans */, 188 new Intent()); 189 190 bindViewHolder(); 191 assertThat(mCarrierInfo.getText().toString()) 192 .isEqualTo("Updated by " + DUMMY_CARRIER + " just now"); 193 } 194 195 @Test testCarrierUpdateTimeWithNoCarrier_shouldSayJustNow()196 public void testCarrierUpdateTimeWithNoCarrier_shouldSayJustNow() { 197 final long updateTime = System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(45); 198 mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update); 199 mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, null /* carrier */, 200 1 /* numPlans */, new Intent()); 201 202 bindViewHolder(); 203 assertThat(mCarrierInfo.getText().toString()) 204 .isEqualTo("Updated just now"); 205 } 206 207 @Test testCarrierUpdateTimeWithNoCarrier_shouldFormatTime()208 public void testCarrierUpdateTimeWithNoCarrier_shouldFormatTime() { 209 final long updateTime = System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(2); 210 mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update); 211 mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, null /* carrier */, 212 1 /* numPlans */, new Intent()); 213 214 bindViewHolder(); 215 assertThat(mCarrierInfo.getText().toString()) 216 .isEqualTo("Updated 2 min ago"); 217 } 218 219 @Test setUsageInfo_withRecentCarrierUpdate_doesNotSetCarrierInfoWarningColorAndFont()220 public void setUsageInfo_withRecentCarrierUpdate_doesNotSetCarrierInfoWarningColorAndFont() { 221 final long updateTime = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1); 222 mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update); 223 mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, DUMMY_CARRIER, 1 /* numPlans */, 224 new Intent()); 225 226 bindViewHolder(); 227 assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.VISIBLE); 228 assertThat(mCarrierInfo.getCurrentTextColor()).isEqualTo( 229 Utils.getColorAttr(mContext, android.R.attr.textColorSecondary)); 230 assertThat(mCarrierInfo.getTypeface()).isEqualTo(Typeface.SANS_SERIF); 231 } 232 233 @Test testSetUsageInfo_withStaleCarrierUpdate_setsCarrierInfoWarningColorAndFont()234 public void testSetUsageInfo_withStaleCarrierUpdate_setsCarrierInfoWarningColorAndFont() { 235 final long updateTime = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(7); 236 mSummaryPreference.setUsageInfo(mCycleEnd, updateTime, DUMMY_CARRIER, 1 /* numPlans */, 237 new Intent()); 238 239 bindViewHolder(); 240 assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.VISIBLE); 241 assertThat(mCarrierInfo.getCurrentTextColor()).isEqualTo( 242 Utils.getColorAttr(mContext, android.R.attr.colorError)); 243 assertThat(mCarrierInfo.getTypeface()).isEqualTo( 244 DataUsageSummaryPreference.SANS_SERIF_MEDIUM); 245 } 246 247 @Test testSetUsageInfo_withNoDataPlans_usageTitleNotShown()248 public void testSetUsageInfo_withNoDataPlans_usageTitleNotShown() { 249 mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */, 250 new Intent()); 251 252 bindViewHolder(); 253 assertThat(mUsageTitle.getVisibility()).isEqualTo(View.GONE); 254 } 255 256 @Test testSetUsageInfo_withMultipleDataPlans_usageTitleShown()257 public void testSetUsageInfo_withMultipleDataPlans_usageTitleShown() { 258 mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 2 /* numPlans */, 259 new Intent()); 260 261 bindViewHolder(); 262 assertThat(mUsageTitle.getVisibility()).isEqualTo(View.VISIBLE); 263 } 264 265 @Test testSetUsageInfo_cycleRemainingTimeIsLessOneDay()266 public void testSetUsageInfo_cycleRemainingTimeIsLessOneDay() { 267 // just under one day 268 final long cycleEnd = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(23); 269 mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */, 270 new Intent()); 271 272 bindViewHolder(); 273 assertThat(mCycleTime.getVisibility()).isEqualTo(View.VISIBLE); 274 assertThat(mCycleTime.getText()).isEqualTo( 275 mContext.getString(R.string.billing_cycle_less_than_one_day_left)); 276 } 277 278 @Test testSetUsageInfo_cycleRemainingTimeNegativeDaysLeft_shouldDisplayNoneLeft()279 public void testSetUsageInfo_cycleRemainingTimeNegativeDaysLeft_shouldDisplayNoneLeft() { 280 final long cycleEnd = System.currentTimeMillis() - 1L; 281 mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */, 282 new Intent()); 283 284 bindViewHolder(); 285 assertThat(mCycleTime.getVisibility()).isEqualTo(View.VISIBLE); 286 assertThat(mCycleTime.getText()).isEqualTo( 287 mContext.getString(R.string.billing_cycle_none_left)); 288 } 289 290 @Test testSetUsageInfo_cycleRemainingTimeDaysLeft_shouldUsePlurals()291 public void testSetUsageInfo_cycleRemainingTimeDaysLeft_shouldUsePlurals() { 292 final int daysLeft = 3; 293 final long cycleEnd = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(daysLeft) 294 + TimeUnit.HOURS.toMillis(1); 295 mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */, 296 new Intent()); 297 298 bindViewHolder(); 299 assertThat(mCycleTime.getVisibility()).isEqualTo(View.VISIBLE); 300 assertThat(mCycleTime.getText()).isEqualTo(daysLeft + " days left"); 301 } 302 303 @Test testSetLimitInfo_withLimitInfo_dataLimitsShown()304 public void testSetLimitInfo_withLimitInfo_dataLimitsShown() { 305 final String limitText = "test limit text"; 306 mSummaryPreference.setLimitInfo(limitText); 307 308 bindViewHolder(); 309 assertThat(mDataLimits.getVisibility()).isEqualTo(View.VISIBLE); 310 assertThat(mDataLimits.getText()).isEqualTo(limitText); 311 } 312 313 @Test testSetLimitInfo_withNullLimitInfo_dataLimitsNotShown()314 public void testSetLimitInfo_withNullLimitInfo_dataLimitsNotShown() { 315 mSummaryPreference.setLimitInfo(null); 316 317 bindViewHolder(); 318 assertThat(mDataLimits.getVisibility()).isEqualTo(View.GONE); 319 } 320 321 @Test testSetChartEnabledFalse_hidesLabelBar()322 public void testSetChartEnabledFalse_hidesLabelBar() { 323 setValidLabels(); 324 mSummaryPreference.setChartEnabled(false); 325 326 bindViewHolder(); 327 assertThat(mLabelBar.getVisibility()).isEqualTo(View.GONE); 328 assertThat(mProgressBar.getVisibility()).isEqualTo(View.GONE); 329 } 330 331 @Test testSetEmptyLabels_hidesLabelBar()332 public void testSetEmptyLabels_hidesLabelBar() { 333 mSummaryPreference.setLabels("", ""); 334 335 bindViewHolder(); 336 assertThat(mLabelBar.getVisibility()).isEqualTo(View.GONE); 337 assertThat(mProgressBar.getVisibility()).isEqualTo(View.GONE); 338 } 339 340 @Test testLabelBar_isVisible_whenLabelsSet()341 public void testLabelBar_isVisible_whenLabelsSet() { 342 setValidLabels(); 343 //mChartEnabled defaults to true 344 345 bindViewHolder(); 346 assertThat(mLabelBar.getVisibility()).isEqualTo(View.VISIBLE); 347 assertThat(mProgressBar.getVisibility()).isEqualTo(View.VISIBLE); 348 } 349 350 351 @Test testSetProgress_updatesProgressBar()352 public void testSetProgress_updatesProgressBar() { 353 setValidLabels(); 354 mSummaryPreference.setProgress(.5f); 355 356 bindViewHolder(); 357 assertThat(mProgressBar.getProgress()).isEqualTo(50); 358 } 359 setValidLabels()360 private void setValidLabels() { 361 mSummaryPreference.setLabels("0.0 GB", "5.0 GB"); 362 } 363 364 @Test testSetUsageAndRemainingInfo_withUsageInfo_dataUsageAndRemainingShown()365 public void testSetUsageAndRemainingInfo_withUsageInfo_dataUsageAndRemainingShown() { 366 mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 1 /* numPlans */, 367 new Intent()); 368 mSummaryPreference.setUsageNumbers( 369 BillingCycleSettings.MIB_IN_BYTES, 370 10 * BillingCycleSettings.MIB_IN_BYTES, 371 true /* hasMobileData */); 372 373 bindViewHolder(); 374 assertThat(mDataUsed.getText().toString()).isEqualTo("1.00 MB used"); 375 assertThat(mDataRemaining.getText().toString()).isEqualTo("9.00 MB left"); 376 assertThat(mDataRemaining.getVisibility()).isEqualTo(View.VISIBLE); 377 final int colorId = Utils.getColorAttr(mContext, android.R.attr.colorAccent); 378 assertThat(mDataRemaining.getCurrentTextColor()).isEqualTo(colorId); 379 } 380 381 @Test testSetUsageInfo_withDataOverusage()382 public void testSetUsageInfo_withDataOverusage() { 383 mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 1 /* numPlans */, 384 new Intent()); 385 mSummaryPreference.setUsageNumbers( 386 11 * BillingCycleSettings.MIB_IN_BYTES, 387 10 * BillingCycleSettings.MIB_IN_BYTES, 388 true /* hasMobileData */); 389 390 bindViewHolder(); 391 assertThat(mDataUsed.getText().toString()).isEqualTo("11.00 MB used"); 392 assertThat(mDataRemaining.getText().toString()).isEqualTo("1.00 MB over"); 393 final int colorId = Utils.getColorAttr(mContext, android.R.attr.colorError); 394 assertThat(mDataRemaining.getCurrentTextColor()).isEqualTo(colorId); 395 } 396 397 @Test testSetUsageInfo_withUsageInfo_dataUsageShown()398 public void testSetUsageInfo_withUsageInfo_dataUsageShown() { 399 mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */, 400 new Intent()); 401 mSummaryPreference.setUsageNumbers( 402 BillingCycleSettings.MIB_IN_BYTES, -1L, true /* hasMobileData */); 403 404 bindViewHolder(); 405 assertThat(mDataUsed.getText().toString()).isEqualTo("1.00 MB used"); 406 assertThat(mDataRemaining.getText()).isEqualTo(""); 407 } 408 409 @Test testSetAppIntent_toMdpApp_intentCorrect()410 public void testSetAppIntent_toMdpApp_intentCorrect() { 411 final Activity activity = Robolectric.setupActivity(Activity.class); 412 final Intent intent = new Intent(SubscriptionManager.ACTION_MANAGE_SUBSCRIPTION_PLANS); 413 intent.setPackage("test-owner.example.com"); 414 intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, 42); 415 416 mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */, 417 intent); 418 419 bindViewHolder(); 420 assertThat(mLaunchButton.getVisibility()).isEqualTo(View.VISIBLE); 421 assertThat(mLaunchButton.getText()) 422 .isEqualTo(mContext.getString(R.string.launch_mdp_app_text)); 423 424 mLaunchButton.callOnClick(); 425 ShadowActivity shadowActivity = Shadows.shadowOf(activity); 426 Intent startedIntent = shadowActivity.getNextStartedActivity(); 427 assertThat(startedIntent.getAction()) 428 .isEqualTo(SubscriptionManager.ACTION_MANAGE_SUBSCRIPTION_PLANS); 429 assertThat(startedIntent.getPackage()).isEqualTo("test-owner.example.com"); 430 assertThat(startedIntent.getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, -1)) 431 .isEqualTo(42); 432 } 433 434 @Test testSetUsageInfo_withOverflowStrings_dataRemainingNotShown()435 public void testSetUsageInfo_withOverflowStrings_dataRemainingNotShown() { 436 LayoutInflater inflater = LayoutInflater.from(mContext); 437 View view = inflater.inflate(mSummaryPreference.getLayoutResource(), null /* root */, 438 false /* attachToRoot */); 439 440 TextView dataUsed = spy(new TextView(mContext)); 441 TextView dataRemaining = spy(new TextView(mContext)); 442 doReturn(dataUsed).when(mHolder).findViewById(R.id.data_usage_view); 443 doReturn(dataRemaining).when(mHolder).findViewById(R.id.data_remaining_view); 444 445 mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 1 /* numPlans */, 446 new Intent()); 447 mSummaryPreference.setUsageNumbers( 448 BillingCycleSettings.MIB_IN_BYTES, 449 10 * BillingCycleSettings.MIB_IN_BYTES, 450 true /* hasMobileData */); 451 452 when(mContext.getResources()).thenCallRealMethod(); 453 when(mContext.getText(R.string.data_used_formatted)) 454 .thenReturn("^1 ^2 used with long trailing text"); 455 when(mContext.getText(R.string.data_remaining)).thenReturn("^1 left"); 456 457 bindViewHolder(); 458 459 doReturn(500).when(dataUsed).getMeasuredWidth(); 460 doReturn(500).when(dataRemaining).getMeasuredWidth(); 461 462 assertThat(dataRemaining.getVisibility()).isEqualTo(View.VISIBLE); 463 464 MeasurableLinearLayout layout = 465 (MeasurableLinearLayout) mHolder.findViewById(R.id.usage_layout); 466 layout.measure( 467 View.MeasureSpec.makeMeasureSpec(800, View.MeasureSpec.EXACTLY), 468 View.MeasureSpec.makeMeasureSpec(1000, View.MeasureSpec.EXACTLY)); 469 470 assertThat(dataUsed.getText().toString()).isEqualTo("1.00 MB used with long trailing text"); 471 assertThat(dataRemaining.getVisibility()).isEqualTo(View.GONE); 472 } 473 474 @Test testSetWifiMode_withUsageInfo_dataUsageShown()475 public void testSetWifiMode_withUsageInfo_dataUsageShown() { 476 final int daysLeft = 3; 477 final long cycleEnd = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(daysLeft) 478 + TimeUnit.HOURS.toMillis(1); 479 final Activity activity = Robolectric.setupActivity(Activity.class); 480 mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */, 481 new Intent()); 482 mSummaryPreference.setUsageNumbers(1000000L, -1L, true); 483 final String cycleText = "The quick fox"; 484 mSummaryPreference.setWifiMode(true, cycleText); 485 486 bindViewHolder(); 487 assertThat(mUsageTitle.getText().toString()) 488 .isEqualTo(mContext.getString(R.string.data_usage_wifi_title)); 489 assertThat(mUsageTitle.getVisibility()).isEqualTo(View.VISIBLE); 490 assertThat(mCycleTime.getVisibility()).isEqualTo(View.VISIBLE); 491 assertThat(mCycleTime.getText()).isEqualTo(cycleText); 492 assertThat(mCarrierInfo.getVisibility()).isEqualTo(View.GONE); 493 assertThat(mDataLimits.getVisibility()).isEqualTo(View.GONE); 494 assertThat(mLaunchButton.getVisibility()).isEqualTo(View.VISIBLE); 495 assertThat(mLaunchButton.getText()) 496 .isEqualTo(mContext.getString(R.string.launch_wifi_text)); 497 498 mLaunchButton.callOnClick(); 499 ShadowActivity shadowActivity = Shadows.shadowOf(activity); 500 Intent startedIntent = shadowActivity.getNextStartedActivity(); 501 assertThat(startedIntent.getComponent()).isEqualTo(new ComponentName("com.android.settings", 502 SubSettings.class.getName())); 503 504 final Bundle expect = new Bundle(1); 505 expect.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, 506 NetworkTemplate.buildTemplateWifiWildcard()); 507 final Bundle actual = startedIntent 508 .getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS); 509 assertThat((NetworkTemplate) actual.getParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE)) 510 .isEqualTo(NetworkTemplate.buildTemplateWifiWildcard()); 511 512 assertThat(startedIntent.getCharSequenceExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE)) 513 .isEqualTo(mContext.getString(R.string.wifi_data_usage)); 514 } 515 bindViewHolder()516 private void bindViewHolder() { 517 mSummaryPreference.onBindViewHolder(mHolder); 518 mUsageTitle = (TextView) mHolder.findViewById(R.id.usage_title); 519 mCycleTime = (TextView) mHolder.findViewById(R.id.cycle_left_time); 520 mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update); 521 mDataLimits = (TextView) mHolder.findViewById(R.id.data_limits); 522 mDataUsed = spy((TextView) mHolder.findViewById(R.id.data_usage_view)); 523 mDataRemaining = spy((TextView) mHolder.findViewById(R.id.data_remaining_view)); 524 mLaunchButton = (Button) mHolder.findViewById(R.id.launch_mdp_app_button); 525 mLabelBar = (LinearLayout) mHolder.findViewById(R.id.label_bar); 526 mLabel1 = (TextView) mHolder.findViewById(R.id.text1); 527 mLabel2 = (TextView) mHolder.findViewById(R.id.text2); 528 mProgressBar = (ProgressBar) mHolder.findViewById(R.id.determinateBar); 529 } 530 } 531