Commit 66ee381e authored by Matt Simmons's avatar Matt Simmons Committed by Commit Bot

Hide the MV tiles if in incognito.

* If in incognito, hide the MV tile layout.
* Start MVC'ing the MV tile list component.
* Add tests for MVC'ed bits.

Bug: 985386
Change-Id: I479756d2c28bb1dd743821e84803f6b53b68c669
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1814575Reviewed-by: default avatarYusuf Ozuysal <yusufo@chromium.org>
Commit-Queue: Matt Simmons <mattsimmons@chromium.org>
Cr-Commit-Position: refs/heads/master@{#699422}
parent 0ff2906c
......@@ -78,6 +78,9 @@ android_resources("java_resources") {
android_library("java") {
java_files = [
"java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java",
"java/src/org/chromium/chrome/browser/tasks/MostVisitedListMediator.java",
"java/src/org/chromium/chrome/browser/tasks/MostVisitedListViewBinder.java",
"java/src/org/chromium/chrome/browser/tasks/MostVisitedListProperties.java",
"java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java",
"java/src/org/chromium/chrome/browser/tasks/TasksSurfaceCoordinator.java",
"java/src/org/chromium/chrome/browser/tasks/TasksView.java",
......
......@@ -15,12 +15,12 @@
android:layout_height="wrap_content"
android:background="@color/modern_primary_color"
android:visibility="gone"
android:scrollbars="none"
android:paddingBottom="@dimen/tasks_view_items_vertical_spacing">
android:scrollbars="none">
<LinearLayout android:id="@+id/mv_tiles_layout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal" />
android:orientation="horizontal"
android:paddingBottom="@dimen/tasks_view_items_vertical_spacing" />
</HorizontalScrollView>
<LinearLayout
android:id="@+id/tab_switcher_title"
......
......@@ -20,7 +20,6 @@ import org.chromium.chrome.browser.suggestions.ImageFetcher;
import org.chromium.chrome.browser.suggestions.SuggestionsConfig;
import org.chromium.chrome.browser.suggestions.SuggestionsDependencyFactory;
import org.chromium.chrome.browser.suggestions.SuggestionsEventReporter;
import org.chromium.chrome.browser.suggestions.SuggestionsRanker;
import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegateImpl;
import org.chromium.chrome.browser.suggestions.tile.SuggestionsTileView;
......@@ -31,27 +30,36 @@ import org.chromium.chrome.browser.suggestions.tile.TileGroupDelegateImpl;
import org.chromium.chrome.browser.suggestions.tile.TileRenderer;
import org.chromium.chrome.browser.suggestions.tile.TileSectionType;
import org.chromium.ui.base.PageTransition;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
/**
* Coordinator for displaying a list of {@link SuggestionsTileView} in a {@link ViewGroup}.
*
* TODO(mattsimmons): Finish MVC of this. The way the renderer builds the layout complicates things.
* TODO(mattsimmons): Move logic and view manipulation into the mediator/viewbinder. (and add tests)
*/
class MostVisitedListCoordinator implements TileGroup.Observer, TileGroup.TileSetupDelegate {
private static final int TITLE_LINES = 1;
// There's a limit of 12 in {@link MostVisitedSitesBridge#setObserver}.
private static final int MAX_RESULTS = 12;
private PropertyModelChangeProcessor mModelChangeProcessor;
private MostVisitedListMediator mMediator;
private TileGroup mTileGroup;
private TileRenderer mRenderer;
private ViewGroup mParent;
public MostVisitedListCoordinator(ChromeActivity activity, ViewGroup parent) {
PropertyModel propertyModel = new PropertyModel(MostVisitedListProperties.ALL_KEYS);
mModelChangeProcessor = PropertyModelChangeProcessor.create(
propertyModel, parent, MostVisitedListViewBinder::bind);
mMediator = new MostVisitedListMediator(propertyModel, activity.getTabModelSelector());
mParent = parent;
Profile profile = Profile.getLastUsedProfile();
SuggestionsSource suggestionsSource =
SuggestionsDependencyFactory.getInstance().createSuggestionSource(profile);
SuggestionsRanker suggestionsRanker = new SuggestionsRanker();
SuggestionsEventReporter eventReporter =
SuggestionsDependencyFactory.getInstance().createEventReporter();
......@@ -74,6 +82,10 @@ class MostVisitedListCoordinator implements TileGroup.Observer, TileGroup.TileSe
mTileGroup.startObserving(MAX_RESULTS);
}
void destroy() {
mMediator.destroy();
}
private void updateTileIcon(Tile tile) {
for (int i = 0; i < mParent.getChildCount(); i++) {
View tileView = mParent.getChildAt(i);
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.tasks;
import static org.chromium.chrome.browser.tasks.MostVisitedListProperties.IS_VISIBLE;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
import org.chromium.ui.modelutil.PropertyModel;
/** Mediator handling logic and model operations for most visited list. */
class MostVisitedListMediator {
private final PropertyModel mModel;
private final TabModelSelector mTabModelSelector;
private final TabModelSelectorObserver mTabModelSelectorObserver;
MostVisitedListMediator(PropertyModel model, TabModelSelector tabModelSelector) {
mModel = model;
mTabModelSelector = tabModelSelector;
mTabModelSelectorObserver = new EmptyTabModelSelectorObserver() {
@Override
public void onTabModelSelected(TabModel newModel, TabModel oldModel) {
mModel.set(IS_VISIBLE, !newModel.isIncognito());
}
};
mTabModelSelector.addObserver(mTabModelSelectorObserver);
}
void destroy() {
mTabModelSelector.removeObserver(mTabModelSelectorObserver);
}
}
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.tasks;
import org.chromium.ui.modelutil.PropertyKey;
import org.chromium.ui.modelutil.PropertyModel;
/** View Properties related to displaying a most visited list. */
final class MostVisitedListProperties {
private MostVisitedListProperties() {}
public static final PropertyModel.WritableBooleanPropertyKey IS_VISIBLE =
new PropertyModel.WritableBooleanPropertyKey();
public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {IS_VISIBLE};
}
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.tasks;
import static org.chromium.chrome.browser.tasks.MostVisitedListProperties.IS_VISIBLE;
import android.view.View;
import android.view.ViewGroup;
import org.chromium.ui.modelutil.PropertyKey;
import org.chromium.ui.modelutil.PropertyModel;
/** Model-to-View binder for most visited list. Handles view manipulations. */
final class MostVisitedListViewBinder {
public static void bind(PropertyModel model, ViewGroup viewGroup, PropertyKey propertyKey) {
if (IS_VISIBLE == propertyKey) {
viewGroup.setVisibility(model.get(IS_VISIBLE) ? View.VISIBLE : View.GONE);
}
}
}
......@@ -42,7 +42,6 @@ public class TasksSurfaceCoordinator implements TasksSurface {
mMediator = new TasksSurfaceMediator(
activity, propertyModel, isTabCarousel, activity.getOverviewModeBehavior());
// TODO(mattsimmons): Handle incognito/dark theming.
LinearLayout mvTilesLayout = mView.findViewById(R.id.mv_tiles_layout);
mMostVisitedList = new MostVisitedListCoordinator(activity, mvTilesLayout);
}
......@@ -71,5 +70,6 @@ public class TasksSurfaceCoordinator implements TasksSurface {
@Override
public void destroy() {
mMediator.destroy();
mMostVisitedList.destroy();
}
}
......@@ -22,7 +22,6 @@ class TasksViewBinder {
} else if (propertyKey == MORE_TABS_CLICK_LISTENER) {
view.setMoreTabsOnClickListener(model.get(MORE_TABS_CLICK_LISTENER));
} else if (propertyKey == MV_TILES_VISIBLE) {
// TODO(mattsimmons): Hide these when in incognito mode.
view.setMostVisitedVisibility(model.get(MV_TILES_VISIBLE) ? View.VISIBLE : View.GONE);
} else if (propertyKey == TOP_PADDING) {
view.setPadding(0, model.get(TOP_PADDING), 0, 0);
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.tasks;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import static org.chromium.chrome.browser.tasks.MostVisitedListProperties.IS_VISIBLE;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
import org.chromium.testing.local.LocalRobolectricTestRunner;
import org.chromium.ui.modelutil.PropertyModel;
/**
* Tests for {@link MostVisitedListMediator}.
*/
@RunWith(LocalRobolectricTestRunner.class)
public final class MostVisitedListMediatorUnitTest {
private final PropertyModel mModel = new PropertyModel(MostVisitedListProperties.ALL_KEYS);
@Mock
private TabModel mNewTabModel;
@Mock
private TabModelSelector mTabModelSelector;
@Captor
private ArgumentCaptor<TabModelSelectorObserver> mTabModelSelectorObserverCaptor;
private MostVisitedListMediator mMediator;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mMediator = new MostVisitedListMediator(mModel, mTabModelSelector);
verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture());
}
@Test
public void incognitoTabModel_setsNotVisible() {
mModel.set(IS_VISIBLE, true);
doReturn(true).when(mNewTabModel).isIncognito();
mTabModelSelectorObserverCaptor.getValue().onTabModelSelected(mNewTabModel, null);
assertFalse(mModel.get(IS_VISIBLE));
}
@Test
public void regularTabModel_setsVisible() {
mModel.set(IS_VISIBLE, false);
doReturn(false).when(mNewTabModel).isIncognito();
mTabModelSelectorObserverCaptor.getValue().onTabModelSelected(mNewTabModel, null);
assertTrue(mModel.get(IS_VISIBLE));
}
}
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.tasks;
import static org.mockito.Mockito.verify;
import static org.chromium.chrome.browser.tasks.MostVisitedListProperties.IS_VISIBLE;
import android.view.View;
import android.view.ViewGroup;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.chromium.testing.local.LocalRobolectricTestRunner;
import org.chromium.ui.modelutil.PropertyModel;
/**
* Tests for {@link MostVisitedListViewBinder}.
*/
@RunWith(LocalRobolectricTestRunner.class)
public final class MostVisitedListViewBinderUnitTest {
@Mock
private ViewGroup mViewGroup;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void bind_setsVisibilityCorrectly() {
PropertyModel model = new PropertyModel(MostVisitedListProperties.ALL_KEYS);
Mockito.reset(mViewGroup);
model.set(IS_VISIBLE, true);
MostVisitedListViewBinder.bind(model, mViewGroup, IS_VISIBLE);
verify(mViewGroup).setVisibility(View.VISIBLE);
Mockito.reset(mViewGroup);
model.set(IS_VISIBLE, false);
MostVisitedListViewBinder.bind(model, mViewGroup, IS_VISIBLE);
verify(mViewGroup).setVisibility(View.GONE);
}
}
......@@ -30,6 +30,8 @@ tab_management_test_java_sources = [
]
tab_management_junit_java_sources = [
"//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/MostVisitedListMediatorUnitTest.java",
"//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/MostVisitedListViewBinderUnitTest.java",
"//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java",
"//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java",
"//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediatorUnitTest.java",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment