Files
cromite/build/patches/Restore-Simplified-NTP-launch.patch
T

779 lines
39 KiB
Diff

From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Sat, 7 Nov 2020 23:51:29 +0100
Subject: Restore Simplified NTP launch
This reverts commit 4d0e4483c5f77c66a8b6193e8a3bec5d0624d6ad.
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
chrome/android/chrome_java_resources.gni | 1 +
chrome/android/chrome_java_sources.gni | 2 +
.../java/res/layout/mv_tiles_layout.xml | 13 +-
.../java/res/layout/new_tab_page_layout.xml | 7 +
.../android/java/res/layout/ntp_shortcuts.xml | 65 ++++++
chrome/android/java/res/values/attrs.xml | 4 +
chrome/android/java/res/values/dimens.xml | 2 +
.../feedback/ChromeFeedbackCollector.java | 1 +
.../feedback/SimplifiedNtpFeedbackSource.java | 38 ++++
.../identity_disc/IdentityDiscController.java | 5 +-
.../NativePageNavigationDelegateImpl.java | 2 +-
.../chrome/browser/ntp/NewTabPageLayout.java | 25 ++-
.../SuggestionsNavigationDelegate.java | 17 ++
.../mostvisited/MostVisitedSitesBridge.java | 2 +-
.../tile/MostVisitedTilesCoordinator.java | 10 +-
.../tile/MostVisitedTilesGridLayout.java | 194 ++++++++++++++++++
.../tile/MostVisitedTilesMediator.java | 9 +-
.../engagement/important_sites_util.cc | 2 +-
.../flags/android/chrome_feature_list.cc | 1 +
.../browser/flags/ChromeFeatureList.java | 5 +-
.../history/core/browser/top_sites_impl.h | 2 +-
.../Restore-Simplified-NTP-launch.inc | 12 ++
.../Restore-Simplified-NTP-launch.inc | 6 +
.../Restore-Simplified-NTP-launch.inc | 1 +
24 files changed, 396 insertions(+), 30 deletions(-)
create mode 100644 chrome/android/java/res/layout/ntp_shortcuts.xml
create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/feedback/SimplifiedNtpFeedbackSource.java
create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesGridLayout.java
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Restore-Simplified-NTP-launch.inc
create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Restore-Simplified-NTP-launch.inc
create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/Restore-Simplified-NTP-launch.inc
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni
--- a/chrome/android/chrome_java_resources.gni
+++ b/chrome/android/chrome_java_resources.gni
@@ -538,6 +538,7 @@ chrome_java_resources = [
"java/res/layout/new_tab_page_layout.xml",
"java/res/layout/new_tab_page_tile_grid_placeholder.xml",
"java/res/layout/open_full_chrome_history_header.xml",
+ "java/res/layout/ntp_shortcuts.xml",
"java/res/layout/optional_toolbar_button.xml",
"java/res/layout/os_version_unsupported_text.xml",
"java/res/layout/other_forms_of_history_dialog.xml",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -623,6 +623,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/feedback/FeedFeedbackCollector.java",
"java/src/org/chromium/chrome/browser/feedback/HelpAndFeedbackLauncherImpl.java",
"java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java",
+ "java/src/org/chromium/chrome/browser/feedback/SimplifiedNtpFeedbackSource.java",
"java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java",
"java/src/org/chromium/chrome/browser/findinpage/FindToolbarManager.java",
"java/src/org/chromium/chrome/browser/findinpage/FindToolbarObserver.java",
@@ -1054,6 +1055,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesMetadataUtils.java",
"java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesCoordinator.java",
"java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesLayout.java",
+ "java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesGridLayout.java",
"java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesMediator.java",
"java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesProperties.java",
"java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesViewBinder.java",
diff --git a/chrome/android/java/res/layout/mv_tiles_layout.xml b/chrome/android/java/res/layout/mv_tiles_layout.xml
--- a/chrome/android/java/res/layout/mv_tiles_layout.xml
+++ b/chrome/android/java/res/layout/mv_tiles_layout.xml
@@ -5,14 +5,9 @@ Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
-<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+<org.chromium.chrome.browser.suggestions.tile.MostVisitedTilesGridLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/mv_tiles_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:scrollbars="none">
-
- <org.chromium.chrome.browser.suggestions.tile.MostVisitedTilesLayout
- android:id="@+id/mv_tiles_layout"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:orientation="horizontal" />
-</HorizontalScrollView>
+ android:layout_gravity="center_horizontal" />
diff --git a/chrome/android/java/res/layout/new_tab_page_layout.xml b/chrome/android/java/res/layout/new_tab_page_layout.xml
--- a/chrome/android/java/res/layout/new_tab_page_layout.xml
+++ b/chrome/android/java/res/layout/new_tab_page_layout.xml
@@ -38,6 +38,13 @@ found in the LICENSE file.
android:layout_marginTop="16dp"
android:visibility="gone"/>
+ <ViewStub
+ android:id="@+id/shortcuts_stub"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:inflatedId="@+id/shortcuts"
+ android:layout="@layout/ntp_shortcuts" />
+
<!-- Middle spacer -->
<View
android:id="@+id/ntp_middle_spacer"
diff --git a/chrome/android/java/res/layout/ntp_shortcuts.xml b/chrome/android/java/res/layout/ntp_shortcuts.xml
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/res/layout/ntp_shortcuts.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2018 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. -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/shortcuts"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingStart="16dp"
+ android:paddingEnd="16dp"
+ android:baselineAligned="false"
+ android:gravity="center"
+ android:orientation="horizontal" >
+
+ <FrameLayout
+ android:id="@+id/bookmarks_button"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="wrap_content"
+ android:minHeight="48dp"
+ android:background="?attr/selectableItemBackground"
+ android:paddingTop="4dp"
+ android:paddingBottom="4dp" >
+
+ <org.chromium.components.browser_ui.widget.text.TextViewWithCompoundDrawables
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:layout_gravity="center"
+ android:drawablePadding="8dp"
+ android:drawableStart="@drawable/btn_star_filled"
+ android:text="@string/menu_bookmarks"
+ android:textAppearance="@style/TextAppearance.TextSmall.Secondary"
+ app:drawableHeight="20sp"
+ app:drawableWidth="20sp"
+ app:chromeDrawableTint="@color/default_icon_color_light" />
+ </FrameLayout>
+
+ <FrameLayout
+ android:id="@+id/downloads_button"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="wrap_content"
+ android:minHeight="48dp"
+ android:background="?attr/selectableItemBackground"
+ android:paddingTop="4dp"
+ android:paddingBottom="4dp" >
+
+ <org.chromium.components.browser_ui.widget.text.TextViewWithCompoundDrawables
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:layout_gravity="center"
+ android:drawablePadding="8dp"
+ android:drawableStart="@drawable/ic_file_download_white_24dp"
+ android:text="@string/menu_downloads"
+ android:textAppearance="@style/TextAppearance.TextSmall.Secondary"
+ app:drawableHeight="20sp"
+ app:drawableWidth="20sp"
+ app:chromeDrawableTint="@color/default_icon_color_light" />
+ </FrameLayout>
+</LinearLayout>
diff --git a/chrome/android/java/res/values/attrs.xml b/chrome/android/java/res/values/attrs.xml
--- a/chrome/android/java/res/values/attrs.xml
+++ b/chrome/android/java/res/values/attrs.xml
@@ -15,6 +15,10 @@ found in the LICENSE file.
<attr name="emptyErrorMessage" format="string" />
</declare-styleable>
+ <declare-styleable name="MostVisitedTilesGridLayout">
+ <attr name="minHorizontalSpacing" format="dimension"/>
+ </declare-styleable>
+
<declare-styleable name="ExploreSitesTileView">
<attr name="iconCornerRadius" format="dimension"/>
</declare-styleable>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -127,6 +127,8 @@ found in the LICENSE file.
<dimen name="find_in_page_popup_margin_end">62dp</dimen>
<!-- NTP dimensions -->
+ <dimen name="tile_grid_layout_vertical_spacing">6dp</dimen>
+ <dimen name="tile_grid_layout_min_horizontal_spacing">4dp</dimen>
<dimen name="tile_layout_no_logo_top_margin">20dp</dimen>
<dimen name="mvt_container_lateral_margin">@dimen/signin_promo_lateral_paddings</dimen>
<dimen name="mvt_container_top_padding">17dp</dimen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java b/chrome/android/java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java
@@ -63,6 +63,7 @@ public class ChromeFeedbackCollector extends FeedbackCollector<ChromeFeedbackCol
sources.add(new LowEndDeviceFeedbackSource());
sources.add(new IMEFeedbackSource());
sources.add(new PermissionFeedbackSource());
+ sources.add(new SimplifiedNtpFeedbackSource());
sources.add(new FeedbackContextFeedbackSource(initParams.feedbackContext));
sources.add(
new AutoDarkFeedbackSource(initParams.profile, activity, new GURL(initParams.url)));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/feedback/SimplifiedNtpFeedbackSource.java b/chrome/android/java/src/org/chromium/chrome/browser/feedback/SimplifiedNtpFeedbackSource.java
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/feedback/SimplifiedNtpFeedbackSource.java
@@ -0,0 +1,38 @@
+// Copyright 2018 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.feedback;
+
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.ntp.NewTabPageLayout;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Provides information about whether the simplified NTP is enabled for use in feedback reports.
+ */
+public class SimplifiedNtpFeedbackSource implements FeedbackSource {
+ private static final String SIMPLIFIED_NTP_KEY = "Simplified NTP";
+ private static final String ENABLED_VALUE = "Enabled";
+ private static final String DISABLED_VALUE = "Disabled";
+
+ private final HashMap<String, String> mMap;
+
+ SimplifiedNtpFeedbackSource() {
+ mMap = new HashMap<String, String>(1);
+
+ boolean isEnabled = ChromeFeatureList.isEnabled(ChromeFeatureList.SIMPLIFIED_NTP);
+ if (!isEnabled) {
+ mMap.put(SIMPLIFIED_NTP_KEY, DISABLED_VALUE);
+ } else {
+ mMap.put(SIMPLIFIED_NTP_KEY, ENABLED_VALUE);
+ }
+ }
+
+ @Override
+ public Map<String, String> getFeedback() {
+ return mMap;
+ }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java b/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java
@@ -153,7 +153,10 @@ public class IdentityDiscController
mButtonData.setButtonSpec(
buttonSpecWithDrawableAndDescription(mButtonData.getButtonSpec(), email));
- mButtonData.setCanShow(true);
+ if (email == null)
+ mButtonData.setCanShow(false);
+ else
+ mButtonData.setCanShow(true);
}
private ButtonSpec buttonSpecWithDrawableAndDescription(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageNavigationDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageNavigationDelegateImpl.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageNavigationDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageNavigationDelegateImpl.java
@@ -30,7 +30,7 @@ import java.util.List;
/** {@link NativePageNavigationDelegate} implementation. */
public class NativePageNavigationDelegateImpl implements NativePageNavigationDelegate {
- private final Profile mProfile;
+ protected final Profile mProfile;
private final TabGroupCreationDialogManager mTabGroupCreationDialogManager;
protected final TabModelSelector mTabModelSelector;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
@@ -15,6 +15,7 @@ import android.text.Editable;
import android.util.AttributeSet;
import android.view.DragEvent;
import android.view.LayoutInflater;
+import android.view.ViewStub;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
@@ -32,6 +33,7 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.feed.FeedSurfaceScrollDelegate;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.lens.LensEntryPoint;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.lens.LensMetrics;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.logo.LogoBridge.Logo;
@@ -89,6 +91,8 @@ public class NewTabPageLayout extends LinearLayout {
private @Nullable DisplayStyleObserver mDisplayStyleObserver;
private CallbackController mCallbackController = new CallbackController();
+ private ViewGroup mShortcutsView;
+
/**
* Whether the tiles shown in the layout have finished loading.
* With {@link #mHasShownView}, it's one of the 2 flags used to track initialisation progress.
@@ -101,7 +105,7 @@ public class NewTabPageLayout extends LinearLayout {
*/
private boolean mHasShownView;
- private boolean mSearchProviderHasLogo = true;
+ private boolean mSearchProviderHasLogo = false;
private boolean mSearchProviderIsGoogle;
private boolean mShowingNonStandardGoogleLogo;
@@ -272,6 +276,7 @@ public class NewTabPageLayout extends LinearLayout {
initializeLogoCoordinator(searchProviderHasLogo, searchProviderIsGoogle);
initializeMostVisitedTilesCoordinator(
mProfile, lifecycleDispatcher, tileGroupDelegate, touchEnabledDelegate);
+ initializeShortcuts();
initializeSearchBoxTextView();
initializeVoiceSearchButton();
initializeLensButton();
@@ -610,7 +615,7 @@ public class NewTabPageLayout extends LinearLayout {
&& mInitialized) {
return;
}
- mSearchProviderHasLogo = hasLogo;
+ mSearchProviderHasLogo = false;
mSearchProviderIsGoogle = isGoogle;
if (!mSearchProviderIsGoogle) {
@@ -945,6 +950,22 @@ public class NewTabPageLayout extends LinearLayout {
return mMostVisitedTilesCoordinator;
}
+ private void initializeShortcuts() {
+ if (!ChromeFeatureList.isEnabled(ChromeFeatureList.SIMPLIFIED_NTP)) {
+ return;
+ }
+
+ ViewStub shortcutsStub = findViewById(R.id.shortcuts_stub);
+ mShortcutsView = (ViewGroup) shortcutsStub.inflate();
+
+ mShortcutsView.findViewById(R.id.bookmarks_button)
+ .setOnClickListener(view -> mManager.getNavigationDelegate().navigateToBookmarks());
+
+ mShortcutsView.findViewById(R.id.downloads_button)
+ .setOnClickListener(
+ view -> mManager.getNavigationDelegate().navigateToDownloadManager());
+ }
+
/** Makes the Search Box and Logo as wide as Most Visited. */
private void unifyElementWidths() {
View searchBoxView = getSearchBoxView();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java
@@ -18,6 +18,11 @@ import org.chromium.chrome.browser.ui.native_page.NativePageHost;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.ui.base.PageTransition;
+import org.chromium.chrome.browser.bookmarks.BookmarkUtils;
+import org.chromium.chrome.browser.download.DownloadUtils;
+import org.chromium.chrome.browser.download.DownloadOpenSource;
+import org.chromium.chrome.browser.profiles.OTRProfileID;
+
/** Extension of {@link NativePageNavigationDelegate} with suggestions-specific methods. */
public class SuggestionsNavigationDelegate extends NativePageNavigationDelegateImpl {
public SuggestionsNavigationDelegate(
@@ -30,6 +35,18 @@ public class SuggestionsNavigationDelegate extends NativePageNavigationDelegateI
super(activity, profile, host, tabModelSelector, tabGroupCreationDialogManager, tab);
}
+ public void navigateToBookmarks() {
+ BookmarkUtils.showBookmarkManager(mActivity, mTab.isIncognito());
+ }
+
+ public void navigateToDownloadManager() {
+ OTRProfileID otrProfileID = null;
+ if (mProfile != null && mTab != null && mTab.isIncognito()) {
+ otrProfileID = mProfile.getOTRProfileID();
+ }
+ DownloadUtils.showDownloadManager(mActivity, mTab, otrProfileID, DownloadOpenSource.NEW_TAB_PAGE);
+ }
+
/**
* Opens the suggestions page without recording metrics.
*
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesBridge.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesBridge.java
@@ -21,7 +21,7 @@ public class MostVisitedSitesBridge implements MostVisitedSites {
* Maximum number of tiles that is explicitly supported. UMA relies on this value, so even if
* the UI supports it, getting more can raise unexpected issues.
*/
- public static final int MAX_TILE_COUNT = 12;
+ public static final int MAX_TILE_COUNT = 12 * 2;
private long mNativeMostVisitedSitesBridge;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesCoordinator.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesCoordinator.java
@@ -38,7 +38,7 @@ public class MostVisitedTilesCoordinator implements ConfigurationChangedObserver
private final MostVisitedTilesMediator mMediator;
private final WindowAndroid mWindowAndroid;
private final UiConfig mUiConfig;
- private final PropertyModelChangeProcessor mModelChangeProcessor;
+ private PropertyModelChangeProcessor mModelChangeProcessor;
private TileRenderer mRenderer;
private ContextMenuManager mContextMenuManager;
private OfflinePageBridge mOfflinePageBridge;
@@ -66,17 +66,11 @@ public class MostVisitedTilesCoordinator implements ConfigurationChangedObserver
mWindowAndroid = windowAndroid;
((ViewStub) mvTilesContainerLayout.findViewById(R.id.mv_tiles_layout_stub)).inflate();
- MostVisitedTilesLayout tilesLayout =
+ MostVisitedTilesGridLayout tilesLayout =
mvTilesContainerLayout.findViewById(R.id.mv_tiles_layout);
mUiConfig = new UiConfig(tilesLayout);
PropertyModel propertyModel = new PropertyModel(MostVisitedTilesProperties.ALL_KEYS);
- mModelChangeProcessor =
- PropertyModelChangeProcessor.create(
- propertyModel,
- new MostVisitedTilesViewBinder.ViewHolder(
- mvTilesContainerLayout, tilesLayout),
- MostVisitedTilesViewBinder::bind);
mRenderer =
new TileRenderer(
mActivity, SuggestionsConfig.getTileStyle(mUiConfig), TITLE_LINES, null);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesGridLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesGridLayout.java
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesGridLayout.java
@@ -0,0 +1,194 @@
+// Copyright 2015 The Chromium Authors
+// 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.suggestions.tile;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.util.Pair;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+
+import org.chromium.base.MathUtils;
+import org.chromium.base.library_loader.LibraryLoader;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.ntp.FeedPositionUtils;
+import org.chromium.chrome.browser.suggestions.SiteSuggestion;
+import org.chromium.ui.base.DeviceFormFactor;
+
+/** A layout that arranges tiles in a grid. */
+public class MostVisitedTilesGridLayout extends FrameLayout {
+ private final int mMinHorizontalSpacing;
+ private final int mMaxHorizontalSpacing;
+ private final int mMaxWidth;
+
+ private int mVerticalSpacing;
+ private int mMaxRows = 4;
+ private int mMaxColumns = 4;
+
+ /**
+ * Constructor for inflating from XML.
+ *
+ * @param context The view context in which this item will be shown.
+ * @param attrs The attributes of the XML tag that is inflating the view.
+ */
+ public MostVisitedTilesGridLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ Resources res = getResources();
+ mVerticalSpacing =
+ getResources().getDimensionPixelOffset(getGridMVTVerticalSpacingResourcesId());
+ TypedArray styledAttrs =
+ context.obtainStyledAttributes(attrs, R.styleable.MostVisitedTilesGridLayout);
+ mMinHorizontalSpacing =
+ styledAttrs.getDimensionPixelOffset(
+ R.styleable.MostVisitedTilesGridLayout_minHorizontalSpacing,
+ res.getDimensionPixelOffset(
+ R.dimen.tile_grid_layout_min_horizontal_spacing));
+ styledAttrs.recycle();
+ mMaxHorizontalSpacing = Integer.MAX_VALUE;
+ mMaxWidth = Integer.MAX_VALUE;
+ }
+
+ /** Sets the maximum number of rows to display. Any items that don't fit will be hidden. */
+ public void setMaxRows(int rows) {
+ mMaxRows = rows;
+ }
+
+ /** Sets the maximum number of columns to display. Any items that don't fit will be hidden. */
+ public void setMaxColumns(int columns) {
+ mMaxColumns = columns;
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int totalWidth = Math.min(MeasureSpec.getSize(widthMeasureSpec), mMaxWidth);
+ int childCount = getChildCount();
+ if (childCount == 0) {
+ setMeasuredDimension(totalWidth, resolveSize(0, heightMeasureSpec));
+ return;
+ }
+
+ // Measure the children. We don't use the ViewGroup.measureChildren() method here because
+ // it only measures visible children. In a situation where a child is invisible before
+ // this measurement and we decide to show it after the measurement, it will not have its
+ // dimensions and will not be displayed.
+ for (int i = 0; i < childCount; i++) {
+ measureChild(getChildAt(i), MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+ }
+
+ // Determine the number of columns that will fit.
+ int childHeight = getChildAt(0).getMeasuredHeight();
+ int childWidth = getChildAt(0).getMeasuredWidth();
+ int numColumns =
+ MathUtils.clamp(
+ (totalWidth + mMinHorizontalSpacing) / (childWidth + mMinHorizontalSpacing),
+ 1,
+ mMaxColumns);
+
+ // Determine how much padding to use between and around the tiles.
+ int gridWidthMinusColumns = Math.max(0, totalWidth - numColumns * childWidth);
+ Pair<Integer, Integer> gridProperties =
+ computeHorizontalDimensions(gridWidthMinusColumns, numColumns);
+ int gridStart = gridProperties.first;
+ int horizontalSpacing = gridProperties.second;
+
+ // Limit the number of rows to mMaxRows.
+ int visibleChildCount = Math.min(childCount, mMaxRows * numColumns);
+
+ // Arrange the visible children in a grid.
+ int numRows = (visibleChildCount + numColumns - 1) / numColumns;
+ int paddingTop = getPaddingTop();
+ boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
+
+ for (int i = 0; i < visibleChildCount; i++) {
+ View child = getChildAt(i);
+ child.setVisibility(View.VISIBLE);
+ int row = i / numColumns;
+ int column = i % numColumns;
+ int childTop = row * (childHeight + mVerticalSpacing);
+ int childStart = gridStart + (column * (childWidth + horizontalSpacing));
+ MarginLayoutParams layoutParams = (MarginLayoutParams) child.getLayoutParams();
+ layoutParams.setMargins(isRtl ? 0 : childStart, childTop, isRtl ? childStart : 0, 0);
+ child.setLayoutParams(layoutParams);
+ }
+
+ // Hide any extra children in case there are more than needed for the maximum number of
+ // rows.
+ for (int i = visibleChildCount; i < childCount; i++) {
+ getChildAt(i).setVisibility(View.GONE);
+ }
+
+ int totalHeight =
+ paddingTop
+ + getPaddingBottom()
+ + numRows * childHeight
+ + (numRows - 1) * mVerticalSpacing;
+
+ setMeasuredDimension(totalWidth, resolveSize(totalHeight, heightMeasureSpec));
+ }
+
+ /**
+ * @param availableWidth The space available to spread between and around the tiles.
+ * @param numColumns The number of columns to be organised.
+ * @return The [gridStart, horizontalSpacing] pair of dimensions.
+ */
+ @VisibleForTesting
+ Pair<Integer, Integer> computeHorizontalDimensions(int availableWidth, int numColumns) {
+ int gridStart;
+ float horizontalSpacing;
+
+ // Identically sized spacers are added both between and around the tiles.
+ int spacerCount = numColumns + 1;
+ horizontalSpacing = (float) availableWidth / spacerCount;
+ gridStart = Math.round(horizontalSpacing);
+
+ if (horizontalSpacing < mMinHorizontalSpacing
+ || horizontalSpacing > mMaxHorizontalSpacing) {
+ // Ensure column spacing isn't greater than mMaxHorizontalSpacing.
+ long gridSidePadding = availableWidth - (long) mMaxHorizontalSpacing * (numColumns - 1);
+ if (gridSidePadding > 0) {
+ horizontalSpacing = mMaxHorizontalSpacing;
+ gridStart = (int) (gridSidePadding / 2);
+ } else {
+ horizontalSpacing = (float) availableWidth / Math.max(1, numColumns - 1);
+ gridStart = 0;
+ }
+ }
+ int screenWidth = getResources().getDisplayMetrics().widthPixels;
+ int screenHeight = getResources().getDisplayMetrics().heightPixels;
+ String logMessage =
+ "|horizontalSpacing| = "
+ + horizontalSpacing
+ + " |numColumns| = "
+ + numColumns
+ + " |availableWidth| = "
+ + availableWidth
+ + " |screenWidth| = "
+ + screenWidth
+ + " |screenHeight| = "
+ + screenHeight
+ + ".";
+ assert horizontalSpacing >= mMinHorizontalSpacing
+ : "Horizontal spacing shouldn't be smaller than minimal horizontal spacing: "
+ + logMessage;
+ assert horizontalSpacing <= mMaxHorizontalSpacing
+ : "Horizontal spacing shouldn't be larger than maximal horizontal spacing: "
+ + logMessage;
+
+ return Pair.create(gridStart, Math.round(horizontalSpacing));
+ }
+
+ // TODO(crbug.com/40226731): Remove this method when the Feed position experiment is cleaned up.
+ private int getGridMVTVerticalSpacingResourcesId() {
+ return R.dimen.tile_grid_layout_vertical_spacing;
+ }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesMediator.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesMediator.java
@@ -12,6 +12,7 @@ import static org.chromium.chrome.browser.suggestions.tile.MostVisitedTilesPrope
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.view.ViewGroup;
import android.view.ViewStub;
import androidx.annotation.Nullable;
@@ -37,7 +38,7 @@ public class MostVisitedTilesMediator implements TileGroup.Observer, TemplateUrl
private final Resources mResources;
private final UiConfig mUiConfig;
- private final MostVisitedTilesLayout mMvTilesLayout;
+ private final ViewGroup mMvTilesLayout;
private final ViewStub mNoMvPlaceholderStub;
private final PropertyModel mModel;
private final boolean mIsTablet;
@@ -59,7 +60,7 @@ public class MostVisitedTilesMediator implements TileGroup.Observer, TemplateUrl
public MostVisitedTilesMediator(
Resources resources,
UiConfig uiConfig,
- MostVisitedTilesLayout mvTilesLayout,
+ ViewGroup mvTilesLayout,
ViewStub noMvPlaceholderStub,
TileRenderer renderer,
PropertyModel propertyModel,
@@ -166,8 +167,8 @@ public class MostVisitedTilesMediator implements TileGroup.Observer, TemplateUrl
}
public void destroy() {
- if (mMvTilesLayout != null) {
- mMvTilesLayout.destroy();
+ if (mMvTilesLayout instanceof MostVisitedTilesLayout) {
+ ((MostVisitedTilesLayout)mMvTilesLayout).destroy();
}
if (mTileGroup != null) {
diff --git a/chrome/browser/engagement/important_sites_util.cc b/chrome/browser/engagement/important_sites_util.cc
--- a/chrome/browser/engagement/important_sites_util.cc
+++ b/chrome/browser/engagement/important_sites_util.cc
@@ -66,7 +66,7 @@ static const int kTimesIgnoredForSuppression = 3;
// These are the maximum # of bookmarks we can use as signals. If the user has
// <= kMaxBookmarks, then we just use those bookmarks. Otherwise we filter all
// bookmarks on site engagement > 0, sort, and trim to kMaxBookmarks.
-static const int kMaxBookmarks = 5;
+static const int kMaxBookmarks = 4 * 4 + 2;
// We need this to be a macro, as the histogram macros cache their pointers
// after the first call, so when we change the uma name we check fail if we're
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -247,6 +247,7 @@ const base::Feature* const kFeaturesExposedToJava[] = {
&kGtsCloseTabAnimation,
&kIncognitoReauthenticationForAndroid,
&kIncognitoScreenshot,
+ &kSimplifiedNTP,
&kLensOnQuickActionSearchWidget,
&kLogoPolish,
&kLogoPolishAnimationKillSwitch,
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -360,6 +360,7 @@ public abstract class ChromeFeatureList {
public static final String MAYLAUNCHURL_USES_SEPARATE_STORAGE_PARTITION =
"MayLaunchUrlUsesSeparateStoragePartition";
public static final String MESSAGES_FOR_ANDROID_ADS_BLOCKED = "MessagesForAndroidAdsBlocked";
+ public static final String SIMPLIFIED_NTP = "SimplifiedNTP";
public static final String SEARCH_READY_OMNIBOX = "SearchReadyOmnibox";
public static final String MOST_VISITED_TILES_SELECT_EXISTING_TAB =
"MostVisitedTilesSelectExistingTab";
@@ -650,7 +651,7 @@ public abstract class ChromeFeatureList {
public static final CachedFlag sLogoPolish = newCachedFlag(LOGO_POLISH, true);
public static final CachedFlag sLogoPolishAnimationKillSwitch =
newCachedFlag(LOGO_POLISH_ANIMATION_KILL_SWITCH, true);
- public static final CachedFlag sMagicStackAndroid = newCachedFlag(MAGIC_STACK_ANDROID, true);
+ public static final CachedFlag sMagicStackAndroid = newCachedFlag(MAGIC_STACK_ANDROID, false);
public static final CachedFlag sMostVisitedTilesSelectExistingTab =
newCachedFlag(MOST_VISITED_TILES_SELECT_EXISTING_TAB, false);
public static final CachedFlag sMultiInstanceApplicationStatusCleanup =
@@ -684,7 +685,7 @@ public abstract class ChromeFeatureList {
newCachedFlag(SMALLER_TAB_STRIP_TITLE_LIMIT, true);
public static final CachedFlag sStartSurfaceReturnTime =
newCachedFlag(START_SURFACE_RETURN_TIME, true);
- public static final CachedFlag sSurfacePolish = newCachedFlag(SURFACE_POLISH, true);
+ public static final CachedFlag sSurfacePolish = newCachedFlag(SURFACE_POLISH, false);
public static final CachedFlag sSurfacePolishForToolbarKillSwitch =
newCachedFlag(SURFACE_POLISH_FOR_TOOLBAR_KILL_SWITCH, true);
public static final CachedFlag sTabDragDropAsWindowAndroid =
diff --git a/components/history/core/browser/top_sites_impl.h b/components/history/core/browser/top_sites_impl.h
--- a/components/history/core/browser/top_sites_impl.h
+++ b/components/history/core/browser/top_sites_impl.h
@@ -40,7 +40,7 @@ class TopSitesImplTest;
struct SitesAndQueriesRequest;
// How many top sites to store in the cache.
-static constexpr size_t kTopSitesNumber = 10;
+static constexpr size_t kTopSitesNumber = 4 * 4 + 2;
// This class allows requests for most visited urls on any thread. All other
// methods must be invoked on the UI thread. All mutations to internal state
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Restore-Simplified-NTP-launch.inc b/cromite_flags/chrome/browser/about_flags_cc/Restore-Simplified-NTP-launch.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/Restore-Simplified-NTP-launch.inc
@@ -0,0 +1,12 @@
+#if BUILDFLAG(IS_ANDROID)
+
+#ifdef FLAG_SECTION
+
+ {"simplified-ntp",
+ "Simplified NTP",
+ "Show a simplified New Tab Page.", kOsAndroid,
+ FEATURE_VALUE_TYPE(chrome::android::kSimplifiedNTP)},
+
+#endif
+
+#endif
diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Restore-Simplified-NTP-launch.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Restore-Simplified-NTP-launch.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Restore-Simplified-NTP-launch.inc
@@ -0,0 +1,6 @@
+CROMITE_FEATURE(kSimplifiedNTP,
+ "SimplifiedNTP",
+ base::FEATURE_ENABLED_BY_DEFAULT);
+
+SET_CROMITE_FEATURE_DISABLED(kSurfacePolish);
+SET_CROMITE_FEATURE_DISABLED(kMagicStackAndroid);
diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/Restore-Simplified-NTP-launch.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/Restore-Simplified-NTP-launch.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/Restore-Simplified-NTP-launch.inc
@@ -0,0 +1 @@
+BASE_DECLARE_FEATURE(kSimplifiedNTP);
--