1 // Copyright 2020 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.chrome.browser.toolbar.top; 6 7 import static org.junit.Assert.assertEquals; 8 import static org.mockito.AdditionalMatchers.not; 9 import static org.mockito.ArgumentMatchers.eq; 10 import static org.mockito.Mockito.doReturn; 11 import static org.mockito.Mockito.mock; 12 import static org.mockito.Mockito.times; 13 import static org.mockito.Mockito.verify; 14 15 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.BUTTONS_CLICKABLE; 16 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_AT_START; 17 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_CLICK_HANDLER; 18 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_DESCRIPTION; 19 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_IMAGE; 20 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_IS_VISIBLE; 21 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.INCOGNITO_SWITCHER_VISIBLE; 22 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IN_START_SURFACE_MODE; 23 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IS_VISIBLE; 24 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.LOGO_IS_VISIBLE; 25 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.MENU_IS_VISIBLE; 26 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.NEW_TAB_BUTTON_AT_START; 27 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.NEW_TAB_BUTTON_IS_VISIBLE; 28 29 import android.content.res.Resources; 30 import android.graphics.drawable.Drawable; 31 import android.view.View; 32 33 import org.junit.After; 34 import org.junit.Before; 35 import org.junit.Test; 36 import org.junit.runner.RunWith; 37 import org.mockito.ArgumentCaptor; 38 import org.mockito.Captor; 39 import org.mockito.Mock; 40 import org.mockito.MockitoAnnotations; 41 import org.robolectric.annotation.Config; 42 43 import org.chromium.base.Callback; 44 import org.chromium.base.supplier.ObservableSupplierImpl; 45 import org.chromium.base.test.BaseRobolectricTestRunner; 46 import org.chromium.chrome.browser.identity_disc.IdentityDiscController; 47 import org.chromium.chrome.browser.layouts.LayoutStateProvider; 48 import org.chromium.chrome.browser.layouts.LayoutType; 49 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; 50 import org.chromium.chrome.browser.tab.Tab; 51 import org.chromium.chrome.browser.tabmodel.TabModel; 52 import org.chromium.chrome.browser.tabmodel.TabModelSelector; 53 import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; 54 import org.chromium.chrome.browser.toolbar.ButtonData; 55 import org.chromium.chrome.browser.toolbar.menu_button.MenuButtonCoordinator; 56 import org.chromium.chrome.browser.user_education.IPHCommandBuilder; 57 import org.chromium.chrome.features.start_surface.StartSurfaceState; 58 import org.chromium.components.search_engines.TemplateUrlService; 59 import org.chromium.components.search_engines.TemplateUrlService.TemplateUrlServiceObserver; 60 import org.chromium.ui.modelutil.PropertyModel; 61 62 /** Tests for {@link StartSurfaceToolbarMediator}. */ 63 @RunWith(BaseRobolectricTestRunner.class) 64 @Config(manifest = Config.NONE) 65 public class StartSurfaceToolbarMediatorUnitTest { 66 private PropertyModel mPropertyModel; 67 private StartSurfaceToolbarMediator mMediator; 68 @Mock 69 private LayoutStateProvider mLayoutStateProvider; 70 @Mock 71 TemplateUrlService mTemplateUrlService; 72 @Mock 73 private TabModelSelector mTabModelSelector; 74 @Mock 75 private TabModel mIncognitoTabModel; 76 @Mock 77 Runnable mDismissedCallback; 78 @Mock 79 View.OnClickListener mOnClickListener; 80 @Mock 81 IdentityDiscController mIdentityDiscController; 82 @Mock 83 private Resources mMockResources; 84 @Mock 85 private Drawable mDrawable; 86 @Mock 87 Drawable.ConstantState mMockConstantState; 88 @Mock 89 Callback<IPHCommandBuilder> mMockCallback; 90 @Mock 91 Tab mMockIncognitoTab; 92 @Mock 93 MenuButtonCoordinator mMenuButtonCoordinator; 94 @Captor 95 private ArgumentCaptor<LayoutStateProvider.LayoutStateObserver> mLayoutStateObserverCaptor; 96 @Captor 97 private ArgumentCaptor<TabModelSelectorObserver> mTabModelSelectorObserver; 98 @Captor 99 private ArgumentCaptor<TemplateUrlServiceObserver> mTemplateUrlServiceObserver; 100 101 private ButtonData mButtonData; 102 private ButtonData mDisabledButtonData; 103 private ObservableSupplierImpl<Boolean> mIdentityDiscStateSupplier; 104 105 @Before setUp()106 public void setUp() { 107 MockitoAnnotations.initMocks(this); 108 109 mPropertyModel = mPropertyModel = 110 new PropertyModel.Builder(StartSurfaceToolbarProperties.ALL_KEYS) 111 .with(StartSurfaceToolbarProperties.INCOGNITO_SWITCHER_VISIBLE, true) 112 .with(StartSurfaceToolbarProperties.IN_START_SURFACE_MODE, false) 113 .with(StartSurfaceToolbarProperties.MENU_IS_VISIBLE, true) 114 .with(StartSurfaceToolbarProperties.IS_VISIBLE, true) 115 .build(); 116 mButtonData = new ButtonData(false, mDrawable, mOnClickListener, 0, false, null, true); 117 mDisabledButtonData = new ButtonData(false, null, null, 0, false, null, true); 118 mIdentityDiscStateSupplier = new ObservableSupplierImpl<>(); 119 doReturn(mButtonData) 120 .when(mIdentityDiscController) 121 .getForStartSurface(StartSurfaceState.SHOWN_HOMEPAGE); 122 doReturn(mDisabledButtonData) 123 .when(mIdentityDiscController) 124 .getForStartSurface(not(eq(StartSurfaceState.SHOWN_HOMEPAGE))); 125 126 mMockConstantState = mock(Drawable.ConstantState.class); 127 doReturn(mMockConstantState).when(mDrawable).getConstantState(); 128 doReturn(mDrawable).when(mMockConstantState).newDrawable(); 129 130 TemplateUrlServiceFactory.setInstanceForTesting(mTemplateUrlService); 131 doReturn(true).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); 132 133 doReturn(false).when(mTabModelSelector).isIncognitoSelected(); 134 doReturn(mIncognitoTabModel).when(mTabModelSelector).getModel(true); 135 doReturn(mMockIncognitoTab).when(mIncognitoTabModel).getTabAt(0); 136 doReturn(false).when(mMockIncognitoTab).isClosing(); 137 } 138 139 @After tearDown()140 public void tearDown() { 141 } 142 143 @Test showAndHide()144 public void showAndHide() { 145 createMediator(false, false); 146 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), false); 147 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 148 149 mMediator.setStartSurfaceMode(true); 150 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 151 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 152 assertEquals(mPropertyModel.get(BUTTONS_CLICKABLE), false); 153 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 154 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_IS_VISIBLE), false); 155 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 156 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 157 assertEquals(mPropertyModel.get(MENU_IS_VISIBLE), true); 158 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); 159 160 mMediator.setStartSurfaceToolbarVisibility(false); 161 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 162 assertEquals(mPropertyModel.get(IS_VISIBLE), false); 163 164 mMediator.setStartSurfaceToolbarVisibility(true); 165 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 166 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 167 168 mMediator.setStartSurfaceMode(false); 169 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), false); 170 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 171 assertEquals(mPropertyModel.get(BUTTONS_CLICKABLE), false); 172 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 173 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_IS_VISIBLE), false); 174 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 175 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 176 assertEquals(mPropertyModel.get(MENU_IS_VISIBLE), true); 177 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); 178 } 179 180 @Test showAndHideSetClickable()181 public void showAndHideSetClickable() { 182 createMediator(false, false); 183 mMediator.setStartSurfaceMode(true); 184 assertEquals(mPropertyModel.get(BUTTONS_CLICKABLE), false); 185 186 mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); 187 assertEquals(mPropertyModel.get(BUTTONS_CLICKABLE), true); 188 189 mLayoutStateObserverCaptor.getValue().onStartedHiding(LayoutType.TAB_SWITCHER, true, false); 190 assertEquals(mPropertyModel.get(BUTTONS_CLICKABLE), false); 191 } 192 193 @Test showAndHideHomePage()194 public void showAndHideHomePage() { 195 createMediator(false, false); 196 mMediator.setTabModelSelector(mTabModelSelector); 197 198 doReturn(false).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); 199 mMediator.onNativeLibraryReady(); 200 verify(mTemplateUrlService).addObserver(mTemplateUrlServiceObserver.capture()); 201 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 202 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 203 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); 204 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 205 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), false); 206 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 207 208 mMediator.setStartSurfaceMode(true); 209 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 210 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 211 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); 212 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 213 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 214 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 215 216 mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); 217 mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); 218 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); 219 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 220 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 221 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); 222 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 223 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 224 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 225 } 226 227 @Test showAndHideHomePage_HideIncognitoSwitch()228 public void showAndHideHomePage_HideIncognitoSwitch() { 229 createMediator(false, true); 230 mMediator.setTabModelSelector(mTabModelSelector); 231 232 doReturn(true).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); 233 mMediator.onNativeLibraryReady(); 234 verify(mTemplateUrlService).addObserver(mTemplateUrlServiceObserver.capture()); 235 mMediator.setStartSurfaceMode(true); 236 237 mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); 238 mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); 239 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); 240 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), true); 241 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 242 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); 243 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 244 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 245 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 246 247 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); 248 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 249 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 250 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); 251 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 252 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 253 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 254 } 255 256 @Test showAndHideHomePageNoIncognitoTabs()257 public void showAndHideHomePageNoIncognitoTabs() { 258 createMediator(true, false); 259 mMediator.setTabModelSelector(mTabModelSelector); 260 doReturn(0).when(mIncognitoTabModel).getCount(); 261 262 doReturn(false).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); 263 mMediator.onNativeLibraryReady(); 264 verify(mTemplateUrlService).addObserver(mTemplateUrlServiceObserver.capture()); 265 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 266 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 267 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); 268 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 269 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), false); 270 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 271 272 mMediator.setStartSurfaceMode(true); 273 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 274 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 275 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); 276 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 277 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 278 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 279 280 mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); 281 mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); 282 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); 283 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 284 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 285 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); 286 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 287 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 288 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 289 290 mLayoutStateObserverCaptor.getValue().onStartedHiding(LayoutType.TAB_SWITCHER, true, false); 291 mLayoutStateObserverCaptor.getValue().onFinishedHiding(LayoutType.TAB_SWITCHER); 292 doReturn(1).when(mIncognitoTabModel).getCount(); 293 294 mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); 295 mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); 296 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); 297 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 298 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 299 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); 300 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 301 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 302 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 303 } 304 305 @Test showHomePageWithLogo()306 public void showHomePageWithLogo() { 307 createMediator(false, false); 308 verify(mLayoutStateProvider).addObserver(mLayoutStateObserverCaptor.capture()); 309 310 mMediator.onNativeLibraryReady(); 311 verify(mTemplateUrlService).addObserver(mTemplateUrlServiceObserver.capture()); 312 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 313 314 mMediator.setStartSurfaceMode(true); 315 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 316 317 mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); 318 mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); 319 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); 320 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), true); 321 } 322 323 @Test enableDisableLogo()324 public void enableDisableLogo() { 325 createMediator(false, false); 326 doReturn(false).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); 327 mMediator.onNativeLibraryReady(); 328 verify(mTemplateUrlService).addObserver(mTemplateUrlServiceObserver.capture()); 329 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); 330 mMediator.setStartSurfaceMode(true); 331 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 332 333 doReturn(true).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); 334 mTemplateUrlServiceObserver.getValue().onTemplateURLServiceChanged(); 335 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), true); 336 337 doReturn(false).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); 338 mTemplateUrlServiceObserver.getValue().onTemplateURLServiceChanged(); 339 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 340 } 341 342 @Test showHomePageWithIdentityDisc()343 public void showHomePageWithIdentityDisc() { 344 createMediator(false, false); 345 mMediator.setTabModelSelector(mTabModelSelector); 346 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 347 348 mMediator.setStartSurfaceMode(true); 349 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); 350 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 351 352 mButtonData.contentDescriptionResId = 5; 353 mButtonData.canShow = true; 354 mButtonData.drawable = mDrawable; 355 mMediator.updateIdentityDisc(mButtonData); 356 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), true); 357 assertEquals(mPropertyModel.get(IDENTITY_DISC_CLICK_HANDLER), mOnClickListener); 358 assertEquals(mPropertyModel.get(IDENTITY_DISC_DESCRIPTION), 5); 359 assertEquals(mPropertyModel.get(IDENTITY_DISC_IMAGE), mDrawable); 360 361 Drawable testDrawable2 = mock(Drawable.class); 362 doReturn(mMockConstantState).when(testDrawable2).getConstantState(); 363 doReturn(testDrawable2).when(mMockConstantState).newDrawable(); 364 mButtonData.drawable = testDrawable2; 365 mMediator.updateIdentityDisc(mButtonData); 366 assertEquals(mPropertyModel.get(IDENTITY_DISC_IMAGE), testDrawable2); 367 368 mButtonData.canShow = false; 369 mMediator.updateIdentityDisc(mButtonData); 370 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 371 } 372 373 @Test hideIdentityDiscInIncognito()374 public void hideIdentityDiscInIncognito() { 375 createMediator(false, false); 376 mMediator.setTabModelSelector(mTabModelSelector); 377 verify(mTabModelSelector).addObserver(mTabModelSelectorObserver.capture()); 378 379 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 380 381 mMediator.setStartSurfaceMode(true); 382 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); 383 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 384 385 mButtonData.canShow = true; 386 mMediator.updateIdentityDisc(mButtonData); 387 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), true); 388 389 doReturn(true).when(mTabModelSelector).isIncognitoSelected(); 390 mTabModelSelectorObserver.getValue().onTabModelSelected( 391 mock(TabModel.class), mock(TabModel.class)); 392 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 393 } 394 395 @Test showIPHOnIdentityDisc()396 public void showIPHOnIdentityDisc() { 397 createMediator(false, false); 398 mMediator.setTabModelSelector(mTabModelSelector); 399 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 400 401 mMediator.setStartSurfaceMode(true); 402 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); 403 mButtonData.canShow = true; 404 mButtonData.iphCommandBuilder = new IPHCommandBuilder(mMockResources, "IdentityDisc", 0, 0) 405 .setOnDismissCallback(mDismissedCallback); 406 mMediator.updateIdentityDisc(mButtonData); 407 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), true); 408 409 verify(mMockCallback, times(1)).onResult(mButtonData.iphCommandBuilder); 410 } 411 412 @Test showTabSwitcher()413 public void showTabSwitcher() { 414 createMediator(false, false); 415 mMediator.setTabModelSelector(mTabModelSelector); 416 mMediator.onNativeLibraryReady(); 417 verify(mTemplateUrlService).addObserver(mTemplateUrlServiceObserver.capture()); 418 419 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 420 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 421 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); 422 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 423 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 424 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), false); 425 426 mMediator.setStartSurfaceMode(true); 427 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 428 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 429 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); 430 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 431 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 432 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 433 434 mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); 435 mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); 436 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); 437 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 438 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 439 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); 440 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 441 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 442 443 mMediator.updateIdentityDisc(mButtonData); 444 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 445 } 446 447 @Test showTabSwitcherNoIncognitoTabs()448 public void showTabSwitcherNoIncognitoTabs() { 449 createMediator(true, false); 450 mMediator.setTabModelSelector(mTabModelSelector); 451 doReturn(0).when(mIncognitoTabModel).getCount(); 452 mMediator.onNativeLibraryReady(); 453 verify(mTemplateUrlService).addObserver(mTemplateUrlServiceObserver.capture()); 454 455 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 456 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 457 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); 458 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 459 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 460 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), false); 461 462 mMediator.setStartSurfaceMode(true); 463 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 464 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 465 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); 466 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 467 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 468 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 469 470 mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); 471 mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); 472 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); 473 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 474 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 475 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); 476 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 477 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 478 479 mMediator.updateIdentityDisc(mButtonData); 480 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 481 482 mLayoutStateObserverCaptor.getValue().onStartedHiding(LayoutType.TAB_SWITCHER, true, false); 483 mLayoutStateObserverCaptor.getValue().onFinishedHiding(LayoutType.TAB_SWITCHER); 484 doReturn(1).when(mIncognitoTabModel).getCount(); 485 486 mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); 487 mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); 488 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); 489 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 490 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 491 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); 492 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 493 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 494 } 495 496 @Test homePageToTabswitcher()497 public void homePageToTabswitcher() { 498 createMediator(false, false); 499 mMediator.setTabModelSelector(mTabModelSelector); 500 501 mMediator.onNativeLibraryReady(); 502 verify(mTemplateUrlService).addObserver(mTemplateUrlServiceObserver.capture()); 503 mButtonData.canShow = true; 504 mMediator.updateIdentityDisc(mButtonData); 505 mMediator.setStartSurfaceMode(true); 506 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); 507 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), true); 508 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), true); 509 510 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); 511 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 512 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 513 514 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); 515 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), true); 516 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), true); 517 } 518 519 @Test showTabswitcherTasksOnly()520 public void showTabswitcherTasksOnly() { 521 createMediator(false, false); 522 mMediator.setTabModelSelector(mTabModelSelector); 523 mMediator.onNativeLibraryReady(); 524 verify(mTemplateUrlService).addObserver(mTemplateUrlServiceObserver.capture()); 525 526 mMediator.setStartSurfaceMode(true); 527 mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); 528 mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); 529 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER_TASKS_ONLY, true); 530 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), true); 531 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 532 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); 533 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 534 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 535 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 536 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 537 538 mMediator.setStartSurfaceMode(false); 539 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), false); 540 } 541 542 @Test showTabswitcherOmniboxOnlyNoIncognitoTabs()543 public void showTabswitcherOmniboxOnlyNoIncognitoTabs() { 544 createMediator(true, false); 545 mMediator.setTabModelSelector(mTabModelSelector); 546 doReturn(0).when(mIncognitoTabModel).getCount(); 547 mMediator.onNativeLibraryReady(); 548 verify(mTemplateUrlService).addObserver(mTemplateUrlServiceObserver.capture()); 549 550 mMediator.setStartSurfaceMode(true); 551 mMediator.onStartSurfaceStateChanged( 552 StartSurfaceState.SHOWN_TABSWITCHER_OMNIBOX_ONLY, true); 553 mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); 554 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), true); 555 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 556 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); 557 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), true); 558 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 559 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 560 561 mMediator.setStartSurfaceMode(false); 562 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), false); 563 } 564 565 @Test testIdentityDiscStateChanges()566 public void testIdentityDiscStateChanges() { 567 createMediator(false, false); 568 mMediator.setTabModelSelector(mTabModelSelector); 569 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 570 571 mMediator.setStartSurfaceMode(true); 572 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); 573 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 574 575 mButtonData.canShow = true; 576 mIdentityDiscStateSupplier.set(true); 577 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), true); 578 579 mButtonData.canShow = false; 580 mIdentityDiscStateSupplier.set(false); 581 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 582 583 // updateIdentityDisc() should properly handle a hint that contradicts the true value of 584 // canShow. 585 mButtonData.canShow = false; 586 mIdentityDiscStateSupplier.set(true); 587 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 588 } 589 590 @Test testShowAndHideHomePageWithNewTabAndIdentityDiscAtStart()591 public void testShowAndHideHomePageWithNewTabAndIdentityDiscAtStart() { 592 createMediator(false, false, true); 593 mMediator.setTabModelSelector(mTabModelSelector); 594 doReturn(0).when(mIncognitoTabModel).getCount(); 595 596 doReturn(false).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); 597 mMediator.onNativeLibraryReady(); 598 verify(mTemplateUrlService).addObserver(mTemplateUrlServiceObserver.capture()); 599 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 600 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 601 assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), false); 602 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); 603 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 604 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), false); 605 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 606 607 mMediator.setStartSurfaceMode(true); 608 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 609 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 610 assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), false); 611 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); 612 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 613 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 614 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 615 616 mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); 617 mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); 618 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); 619 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 620 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 621 assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), true); 622 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); 623 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), true); 624 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 625 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 626 627 mLayoutStateObserverCaptor.getValue().onStartedHiding(LayoutType.TAB_SWITCHER, true, false); 628 mLayoutStateObserverCaptor.getValue().onFinishedHiding(LayoutType.TAB_SWITCHER); 629 doReturn(1).when(mIncognitoTabModel).getCount(); 630 631 mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); 632 mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); 633 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); 634 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 635 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 636 assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), true); 637 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); 638 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), true); 639 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 640 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 641 } 642 643 @Test testShowAndHideTabSwitcherWithNewTabAndIdentityDiscAtStart()644 public void testShowAndHideTabSwitcherWithNewTabAndIdentityDiscAtStart() { 645 createMediator(false, false, true); 646 mMediator.setTabModelSelector(mTabModelSelector); 647 doReturn(0).when(mIncognitoTabModel).getCount(); 648 mMediator.onNativeLibraryReady(); 649 verify(mTemplateUrlService).addObserver(mTemplateUrlServiceObserver.capture()); 650 651 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 652 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 653 assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), false); 654 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); 655 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 656 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 657 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), false); 658 659 mMediator.setStartSurfaceMode(true); 660 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 661 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 662 assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), false); 663 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); 664 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); 665 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 666 assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); 667 668 mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); 669 mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); 670 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); 671 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 672 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 673 assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), true); 674 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); 675 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), true); 676 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 677 678 mMediator.updateIdentityDisc(mButtonData); 679 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 680 681 mLayoutStateObserverCaptor.getValue().onStartedHiding(LayoutType.TAB_SWITCHER, true, false); 682 mLayoutStateObserverCaptor.getValue().onFinishedHiding(LayoutType.TAB_SWITCHER); 683 doReturn(1).when(mIncognitoTabModel).getCount(); 684 685 mLayoutStateObserverCaptor.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false); 686 mLayoutStateObserverCaptor.getValue().onFinishedShowing(LayoutType.TAB_SWITCHER); 687 mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); 688 assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); 689 assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); 690 assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), true); 691 assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); 692 assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), true); 693 assertEquals(mPropertyModel.get(IS_VISIBLE), true); 694 } 695 createMediator( boolean hideIncognitoSwitchWhenNoTabs, boolean hideIncognitoSwitchOnHomePage)696 private void createMediator( 697 boolean hideIncognitoSwitchWhenNoTabs, boolean hideIncognitoSwitchOnHomePage) { 698 createMediator(hideIncognitoSwitchWhenNoTabs, hideIncognitoSwitchOnHomePage, false); 699 } 700 createMediator(boolean hideIncognitoSwitchWhenNoTabs, boolean hideIncognitoSwitchOnHomePage, boolean showNewTabAndIdentityDiscAtStart)701 private void createMediator(boolean hideIncognitoSwitchWhenNoTabs, 702 boolean hideIncognitoSwitchOnHomePage, boolean showNewTabAndIdentityDiscAtStart) { 703 mMediator = new StartSurfaceToolbarMediator(mPropertyModel, mMockCallback, 704 hideIncognitoSwitchWhenNoTabs, hideIncognitoSwitchOnHomePage, 705 showNewTabAndIdentityDiscAtStart, mMenuButtonCoordinator, 706 mIdentityDiscStateSupplier, 707 () 708 -> mIdentityDiscController.getForStartSurface( 709 mMediator.getOverviewModeStateForTesting())); 710 711 mMediator.setLayoutStateProvider(mLayoutStateProvider); 712 verify(mLayoutStateProvider).addObserver(mLayoutStateObserverCaptor.capture()); 713 if (showNewTabAndIdentityDiscAtStart) { 714 mPropertyModel.set(INCOGNITO_SWITCHER_VISIBLE, false); 715 } 716 } 717 } 718