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