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

1137 lines
57 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_container.xml | 2 +-
.../java/res/layout/mv_tiles_layout.xml | 13 +-
.../java/res/layout/new_tab_page_layout.xml | 7 +
.../new_tab_page_tile_grid_placeholder.xml | 8 +-
.../android/java/res/layout/ntp_shortcuts.xml | 65 ++++
chrome/android/java/res/values/attrs.xml | 4 +
chrome/android/java/res/values/dimens.xml | 2 +
.../chrome/browser/ChromeTabbedActivity.java | 3 +-
.../browser/TabbedModeTabDelegateFactory.java | 9 +-
.../feedback/ChromeFeedbackCollector.java | 1 +
.../feedback/SimplifiedNtpFeedbackSource.java | 38 +++
.../identity_disc/IdentityDiscController.java | 5 +-
.../native_page/NativePageFactory.java | 19 +-
.../NativePageNavigationDelegateImpl.java | 2 +-
.../chrome/browser/ntp/NewTabPage.java | 8 +-
.../chrome/browser/ntp/NewTabPageLayout.java | 29 +-
.../SuggestionsNavigationDelegate.java | 27 +-
.../mostvisited/MostVisitedSitesBridge.java | 2 +-
.../tile/MostVisitedTilesCoordinator.java | 6 +-
.../tile/MostVisitedTilesGridLayout.java | 283 ++++++++++++++++++
.../tile/MostVisitedTilesMediator.java | 4 +-
.../suggestions/tile/TileRenderer.java | 4 +-
.../suggestions/tile/TilesLinearLayout.java | 2 +-
.../engagement/important_sites_util.cc | 2 +-
.../flags/android/chrome_feature_list.cc | 1 +
.../browser/flags/ChromeFeatureList.java | 3 +-
.../client_util/HomeModulesRankingHelper.java | 1 +
.../history/core/browser/top_sites_impl.h | 2 +-
.../Restore-Simplified-NTP-launch.inc | 12 +
.../Restore-Simplified-NTP-launch.inc | 5 +
.../Restore-Simplified-NTP-launch.inc | 1 +
33 files changed, 528 insertions(+), 45 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
@@ -556,6 +556,7 @@ chrome_java_resources = [
"java/res/layout/new_tab_page_tile_grid_placeholder.xml",
"java/res/layout/one_line_list_item.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
@@ -579,6 +579,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",
@@ -983,6 +984,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_container.xml b/chrome/android/java/res/layout/mv_tiles_container.xml
--- a/chrome/android/java/res/layout/mv_tiles_container.xml
+++ b/chrome/android/java/res/layout/mv_tiles_container.xml
@@ -31,7 +31,7 @@ found in the LICENSE file.
<!-- Site suggestion tile grid placeholder -->
<ViewStub
android:id="@+id/mv_tiles_placeholder_stub"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inflatedId="@+id/tile_grid_placeholder"
android:layout="@layout/new_tab_page_tile_grid_placeholder" />
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
@@ -37,6 +37,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/new_tab_page_tile_grid_placeholder.xml b/chrome/android/java/res/layout/new_tab_page_tile_grid_placeholder.xml
--- a/chrome/android/java/res/layout/new_tab_page_tile_grid_placeholder.xml
+++ b/chrome/android/java/res/layout/new_tab_page_tile_grid_placeholder.xml
@@ -17,14 +17,14 @@ found in the LICENSE file.
android:orientation="vertical">
<ImageView
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
tools:ignore="ContentDescription"
android:src="@drawable/ic_most_visited_placeholder" />
<TextView
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:color="#c8c8c8"
@@ -33,11 +33,11 @@ found in the LICENSE file.
android:textSize="16sp" />
<TextView
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:color="#c8c8c8"
android:gravity="center_horizontal"
android:text="@string/most_visited_placeholder_summary"
android:textSize="12sp" />
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
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
@@ -126,6 +126,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/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -2899,7 +2899,8 @@ public class ChromeTabbedActivity extends ChromeActivity {
getToolbarManager().getTabStripHeightSupplier(),
mModuleRegistrySupplier,
mEdgeToEdgeControllerSupplier,
- getStartupMetricsTracker());
+ getStartupMetricsTracker(),
+ mBookmarkManagerOpenerSupplier);
}
return mTabDelegateFactory;
}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/TabbedModeTabDelegateFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/TabbedModeTabDelegateFactory.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/TabbedModeTabDelegateFactory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/TabbedModeTabDelegateFactory.java
@@ -15,6 +15,7 @@ import org.chromium.base.supplier.OneshotSupplier;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.browser.app.ChromeActivity;
import org.chromium.chrome.browser.app.tab_activity_glue.ActivityTabWebContentsDelegateAndroid;
+import org.chromium.chrome.browser.bookmarks.BookmarkManagerOpener;
import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
import org.chromium.chrome.browser.compositor.CompositorViewHolder;
import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator;
@@ -82,6 +83,7 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory {
private final OneshotSupplier<ModuleRegistry> mModuleRegistrySupplier;
private final ObservableSupplier<EdgeToEdgeController> mEdgeToEdgeControllerSupplier;
private final StartupMetricsTracker mStartupMetricsTracker;
+ private final ObservableSupplier<BookmarkManagerOpener> mBookmarkManagerOpenerSupplier;
private NativePageFactory mNativePageFactory;
@@ -111,7 +113,8 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory {
@NonNull ObservableSupplier<Integer> tabStripHeightSupplier,
@NonNull OneshotSupplier<ModuleRegistry> moduleRegistrySupplier,
@NonNull ObservableSupplier<EdgeToEdgeController> edgeToEdgeControllerSupplier,
- StartupMetricsTracker startupMetricsTracker) {
+ StartupMetricsTracker startupMetricsTracker,
+ @NonNull ObservableSupplier<BookmarkManagerOpener> bookmarkManagerOpenerSupplier) {
mActivity = activity;
mAppBrowserControlsVisibilityDelegate = appBrowserControlsVisibilityDelegate;
mShareDelegateSupplier = shareDelegateSupplier;
@@ -138,6 +141,7 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory {
mModuleRegistrySupplier = moduleRegistrySupplier;
mEdgeToEdgeControllerSupplier = edgeToEdgeControllerSupplier;
mStartupMetricsTracker = startupMetricsTracker;
+ mBookmarkManagerOpenerSupplier = bookmarkManagerOpenerSupplier;
}
@Override
@@ -204,7 +208,8 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory {
mTabStripHeightSupplier,
mModuleRegistrySupplier,
mEdgeToEdgeControllerSupplier,
- mStartupMetricsTracker);
+ mStartupMetricsTracker,
+ mBookmarkManagerOpenerSupplier);
}
return mNativePageFactory.createNativePage(url, candidatePage, tab, pdfInfo);
}
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
@@ -68,6 +68,7 @@ public class ChromeFeedbackCollector extends FeedbackCollector<ChromeFeedbackCol
sources.add(new IMEFeedbackSource());
sources.add(new OmniboxFeedbackSource());
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
@@ -168,7 +168,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/NativePageFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java
@@ -22,6 +22,7 @@ import org.chromium.chrome.browser.AlwaysIncognitoLinkInterceptor;
import org.chromium.chrome.browser.app.ChromeActivity;
import org.chromium.chrome.browser.app.download.home.DownloadPage;
import org.chromium.chrome.browser.bookmarks.BookmarkPage;
+import org.chromium.chrome.browser.bookmarks.BookmarkManagerOpener;
import org.chromium.chrome.browser.browser_controls.BrowserControlsMarginSupplier;
import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
import org.chromium.chrome.browser.fullscreen.BrowserControlsManager;
@@ -78,6 +79,7 @@ public class NativePageFactory {
private final OneshotSupplier<ModuleRegistry> mModuleRegistrySupplier;
private final ObservableSupplier<EdgeToEdgeController> mEdgeToEdgeControllerSupplier;
private final StartupMetricsTracker mStartupMetricsTracker;
+ private final ObservableSupplier<BookmarkManagerOpener> mBookmarkManagerOpenerSupplier;
private NewTabPageUma mNewTabPageUma;
private NativePageBuilder mNativePageBuilder;
@@ -100,7 +102,8 @@ public class NativePageFactory {
@NonNull ObservableSupplier<Integer> tabStripHeightSupplier,
@NonNull OneshotSupplier<ModuleRegistry> moduleRegistrySupplier,
@NonNull ObservableSupplier<EdgeToEdgeController> edgeToEdgeControllerSupplier,
- @NonNull StartupMetricsTracker startupMetricsTracker) {
+ @NonNull StartupMetricsTracker startupMetricsTracker,
+ @NonNull ObservableSupplier<BookmarkManagerOpener> bookmarkManagerOpenerSupplier) {
mActivity = activity;
mBottomSheetController = sheetController;
mBrowserControlsManager = browserControlsManager;
@@ -118,6 +121,7 @@ public class NativePageFactory {
mModuleRegistrySupplier = moduleRegistrySupplier;
mEdgeToEdgeControllerSupplier = edgeToEdgeControllerSupplier;
mStartupMetricsTracker = startupMetricsTracker;
+ mBookmarkManagerOpenerSupplier = bookmarkManagerOpenerSupplier;
}
private NativePageBuilder getBuilder() {
@@ -141,7 +145,8 @@ public class NativePageFactory {
mTabStripHeightSupplier,
mModuleRegistrySupplier,
mEdgeToEdgeControllerSupplier,
- mStartupMetricsTracker);
+ mStartupMetricsTracker,
+ mBookmarkManagerOpenerSupplier);
}
return mNativePageBuilder;
}
@@ -174,9 +179,10 @@ public class NativePageFactory {
private final OneshotSupplier<ModuleRegistry> mModuleRegistrySupplier;
private final ObservableSupplier<EdgeToEdgeController> mEdgeToEdgeControllerSupplier;
private final StartupMetricsTracker mStartupMetricsTracker;
+ private final ObservableSupplier<BookmarkManagerOpener> mBookmarkManagerOpenerSupplier;
public NativePageBuilder(
- Activity activity,
+ ChromeActivity activity,
Supplier<NewTabPageUma> uma,
BottomSheetController sheetController,
BrowserControlsManager browserControlsManager,
@@ -193,7 +199,8 @@ public class NativePageFactory {
ObservableSupplier<Integer> tabStripHeightSupplier,
OneshotSupplier<ModuleRegistry> moduleRegistrySupplier,
ObservableSupplier<EdgeToEdgeController> edgeToEdgeControllerSupplier,
- StartupMetricsTracker startupMetricsTracker) {
+ StartupMetricsTracker startupMetricsTracker,
+ @NonNull ObservableSupplier<BookmarkManagerOpener> bookmarkManagerOpenerSupplier) {
mActivity = activity;
mUma = uma;
mBottomSheetController = sheetController;
@@ -212,6 +219,7 @@ public class NativePageFactory {
mModuleRegistrySupplier = moduleRegistrySupplier;
mEdgeToEdgeControllerSupplier = edgeToEdgeControllerSupplier;
mStartupMetricsTracker = startupMetricsTracker;
+ mBookmarkManagerOpenerSupplier = bookmarkManagerOpenerSupplier;
}
protected NativePage buildNewTabPage(Tab tab, String url) {
@@ -245,7 +253,8 @@ public class NativePageFactory {
mTabStripHeightSupplier,
mModuleRegistrySupplier,
mEdgeToEdgeControllerSupplier,
- mStartupMetricsTracker);
+ mStartupMetricsTracker,
+ mBookmarkManagerOpenerSupplier);
}
protected NativePage buildBookmarksPage(Tab tab) {
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
@@ -25,7 +25,7 @@ import org.chromium.ui.mojom.WindowOpenDisposition;
/** {@link NativePageNavigationDelegate} implementation. */
public class NativePageNavigationDelegateImpl implements NativePageNavigationDelegate {
- private final Profile mProfile;
+ protected final Profile mProfile;
protected final TabModelSelector mTabModelSelector;
protected final Tab mTab;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
@@ -117,6 +117,9 @@ import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.url.GURL;
+import androidx.annotation.NonNull;
+import org.chromium.chrome.browser.bookmarks.BookmarkManagerOpener;
+
import java.util.List;
/** Provides functionality when the user interacts with the NTP. */
@@ -475,7 +478,8 @@ public class NewTabPage
ObservableSupplier<Integer> tabStripHeightSupplier,
OneshotSupplier<ModuleRegistry> moduleRegistrySupplier,
ObservableSupplier<EdgeToEdgeController> edgeToEdgeControllerSupplier,
- StartupMetricsTracker startupMetricsTracker) {
+ StartupMetricsTracker startupMetricsTracker,
+ @NonNull ObservableSupplier<BookmarkManagerOpener> bookmarkManagerOpenerSupplier) {
mConstructedTimeNs = System.nanoTime();
TraceEvent.begin(TAG);
@@ -499,7 +503,7 @@ public class NewTabPage
SuggestionsNavigationDelegate navigationDelegate =
new SuggestionsNavigationDelegate(
- activity, profile, nativePageHost, tabModelSelector, mTab);
+ activity, profile, nativePageHost, tabModelSelector, mTab, bookmarkManagerOpenerSupplier);
mNewTabPageManager =
new NewTabPageManagerImpl(
navigationDelegate, profile, nativePageHost, snackbarManager);
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;
@@ -31,6 +32,7 @@ import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.feed.FeedSurfaceScrollDelegate;
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;
@@ -45,7 +47,7 @@ import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.suggestions.tile.MostVisitedTilesCoordinator;
import org.chromium.chrome.browser.suggestions.tile.TileGroup;
import org.chromium.chrome.browser.suggestions.tile.TileGroup.Delegate;
-import org.chromium.chrome.browser.suggestions.tile.TilesLinearLayout;
+import org.chromium.chrome.browser.suggestions.tile.MostVisitedTilesGridLayout;
import org.chromium.chrome.browser.tab_ui.InvalidationAwareThumbnailProvider;
import org.chromium.chrome.browser.ui.native_page.TouchEnabledDelegate;
import org.chromium.chrome.browser.util.BrowserUiUtils;
@@ -86,6 +88,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.
@@ -98,7 +102,7 @@ public class NewTabPageLayout extends LinearLayout {
*/
private boolean mHasShownView;
- private boolean mSearchProviderHasLogo = true;
+ private boolean mSearchProviderHasLogo = false;
private boolean mSearchProviderIsGoogle;
private boolean mShowingNonStandardGoogleLogo;
@@ -247,6 +251,7 @@ public class NewTabPageLayout extends LinearLayout {
initializeLogoCoordinator(searchProviderHasLogo, searchProviderIsGoogle);
initializeMostVisitedTilesCoordinator(
mProfile, lifecycleDispatcher, tileGroupDelegate, touchEnabledDelegate);
+ initializeShortcuts();
initializeSearchBoxTextView();
initializeVoiceSearchButton();
initializeLensButton();
@@ -506,7 +511,7 @@ public class NewTabPageLayout extends LinearLayout {
if (mInitialTileNum == null) {
mInitialTileNum =
- ((TilesLinearLayout) findViewById(R.id.mv_tiles_layout)).getTileCount();
+ ((MostVisitedTilesGridLayout) findViewById(R.id.mv_tiles_layout)).getTileCount();
}
int currentOrientation = getResources().getConfiguration().orientation;
@@ -574,7 +579,7 @@ public class NewTabPageLayout extends LinearLayout {
&& mInitialized) {
return;
}
- mSearchProviderHasLogo = hasLogo;
+ mSearchProviderHasLogo = false;
mSearchProviderIsGoogle = isGoogle;
if (!mSearchProviderIsGoogle) {
@@ -905,6 +910,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
@@ -22,16 +22,41 @@ import org.chromium.ui.base.PageTransition;
import org.chromium.ui.mojom.WindowOpenDisposition;
import org.chromium.url.GURL;
+import androidx.annotation.NonNull;
+import org.chromium.base.supplier.ObservableSupplier;
+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;
+import org.chromium.chrome.browser.bookmarks.BookmarkManagerOpener;
+
/** Extension of {@link NativePageNavigationDelegate} with suggestions-specific methods. */
public class SuggestionsNavigationDelegate extends NativePageNavigationDelegateImpl {
+ private final @NonNull ObservableSupplier<BookmarkManagerOpener> mBookmarkManagerOpenerSupplier;
+
public SuggestionsNavigationDelegate(
Activity activity,
Profile profile,
NativePageHost host,
TabModelSelector tabModelSelector,
- Tab tab) {
+ Tab tab,
+ @NonNull ObservableSupplier<BookmarkManagerOpener> bookmarkManagerOpenerSupplier) {
super(activity, profile, host, tabModelSelector, tab);
+ mBookmarkManagerOpenerSupplier = bookmarkManagerOpenerSupplier;
+ }
+
+ public void navigateToBookmarks() {
+ mBookmarkManagerOpenerSupplier.get()
+ .showBookmarkManager(mActivity, mTab.getProfile());
+ }
+
+ 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);
}
/**
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
@@ -25,7 +25,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
@@ -65,15 +65,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);
- 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,283 @@
+// 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.suggestions.SiteSuggestion;
+import org.chromium.components.browser_ui.widget.tile.TileView;
+import org.chromium.ui.base.DeviceFormFactor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** 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;
+
+ private List<TileView> mTileList = new ArrayList<TileView>();
+
+ /**
+ * 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;
+ }
+
+ @Override
+ public void removeAllViews() {
+ mTileList.clear();
+ super.removeAllViews();
+ }
+
+ /**
+ * Updates the start margin of all children except the first, to control spacing between.
+ *
+ * @param margin The margin to set.
+ */
+ void setIntervalMargins(int margin) {
+ int childCount = getChildCount();
+ for (int i = 1; i < childCount; i++) {
+ updateViewStartMargin(getChildAt(i), margin);
+ }
+ }
+
+ /**
+ * Updates the start (end) margin the first (last) child, to control spacing around content.
+ *
+ * @param margin The margin to set.
+ */
+ void setEdgeMargins(int margin) {
+ int childCount = getChildCount();
+ if (childCount > 0) {
+ updateViewStartMargin(getChildAt(0), margin);
+ updateViewEndMargin(getChildAt(childCount - 1), margin);
+ }
+ }
+
+ /**
+ * Specialized addView() for tiles.
+ *
+ * @param tileView The tile View to add.
+ */
+ public void addTile(TileView tileView) {
+ super.addView(tileView);
+ mTileList.add(tileView);
+ }
+
+ /**
+ * Specialized getChildCount() for tiles.
+ *
+ * @return The count of TileView children, added from addTile().
+ */
+ public int getTileCount() {
+ return mTileList.size();
+ }
+
+ /**
+ * Specialized getChildAt() for tiles.
+ *
+ * @return The (index+1)-th TileView added via addTile().
+ */
+ public TileView getTileAt(int index) {
+ return mTileList.get(index);
+ }
+
+ private void updateViewStartMargin(View view, int newStartMargin) {
+ MarginLayoutParams layoutParams = (MarginLayoutParams) view.getLayoutParams();
+ if (newStartMargin != layoutParams.getMarginStart()) {
+ layoutParams.setMarginStart(newStartMargin);
+ view.setLayoutParams(layoutParams);
+ }
+ }
+
+ private void updateViewEndMargin(View view, int newEndMargin) {
+ MarginLayoutParams layoutParams = (MarginLayoutParams) view.getLayoutParams();
+ if (newEndMargin != layoutParams.getMarginEnd()) {
+ layoutParams.setMarginEnd(newEndMargin);
+ view.setLayoutParams(layoutParams);
+ }
+ }
+
+ void destroy() {
+ for (int i = 0; i < getTileCount(); i++) {
+ TileView tileView = getTileAt(i);
+ tileView.setOnClickListener(null);
+ tileView.setOnCreateContextMenuListener(null);
+ }
+ removeAllViews();
+ }
+}
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
@@ -37,7 +37,7 @@ public class MostVisitedTilesMediator implements TileGroup.Observer, TemplateUrl
private final Resources mResources;
private final UiConfig mUiConfig;
- private final MostVisitedTilesLayout mMvTilesLayout;
+ private final MostVisitedTilesGridLayout mMvTilesLayout;
private final ViewStub mNoMvPlaceholderStub;
private final PropertyModel mModel;
private final boolean mIsTablet;
@@ -59,7 +59,7 @@ public class MostVisitedTilesMediator implements TileGroup.Observer, TemplateUrl
public MostVisitedTilesMediator(
Resources resources,
UiConfig uiConfig,
- MostVisitedTilesLayout mvTilesLayout,
+ MostVisitedTilesGridLayout mvTilesLayout,
ViewStub noMvPlaceholderStub,
TileRenderer renderer,
PropertyModel propertyModel,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java
@@ -162,7 +162,7 @@ public class TileRenderer {
*/
public void renderTileSection(
List<Tile> sectionTiles,
- TilesLinearLayout parent,
+ MostVisitedTilesGridLayout parent,
TileGroup.TileSetupDelegate setupDelegate) {
try (TraceEvent e = TraceEvent.scoped("TileRenderer.renderTileSection")) {
// Map the old tile views by url so they can be reused later.
@@ -216,7 +216,7 @@ public class TileRenderer {
*/
@VisibleForTesting
SuggestionsTileView buildTileView(
- Tile tile, TilesLinearLayout parent, TileGroup.TileSetupDelegate setupDelegate) {
+ Tile tile, MostVisitedTilesGridLayout parent, TileGroup.TileSetupDelegate setupDelegate) {
SuggestionsTileView tileView =
(SuggestionsTileView)
LayoutInflater.from(parent.getContext()).inflate(mLayout, parent, false);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TilesLinearLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TilesLinearLayout.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TilesLinearLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TilesLinearLayout.java
@@ -23,7 +23,7 @@ import java.util.List;
* #getChildCount()} and {@link #getChildAt()}.
*/
@NullMarked
-public class TilesLinearLayout extends LinearLayout {
+class TilesLinearLayout extends LinearLayout {
private List<TileView> mTileList = new ArrayList<TileView>();
public TilesLinearLayout(Context context, @Nullable AttributeSet attrs) {
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
@@ -65,7 +65,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
@@ -286,6 +286,7 @@ const base::Feature* const kFeaturesExposedToJava[] = {
&kLegacyTabStateDeprecation,
&kLockBackPressHandlerAtStart,
&kIncognitoScreenshot,
+ &kSimplifiedNTP,
&kLensOnQuickActionSearchWidget,
&kMagicStackAndroid,
&kMayLaunchUrlUsesSeparateStoragePartition,
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
@@ -402,6 +402,7 @@ public abstract class ChromeFeatureList {
public static final String MAYLAUNCHURL_USES_SEPARATE_STORAGE_PARTITION =
"MayLaunchUrlUsesSeparateStoragePartition";
public static final String MOST_VISITED_TILES_CUSTOMIZATION = "MostVisitedTilesCustomization";
+ public static final String SIMPLIFIED_NTP = "SimplifiedNTP";
public static final String SEARCH_READY_OMNIBOX = "SearchReadyOmnibox";
public static final String MOST_VISITED_TILES_RESELECT = "MostVisitedTilesReselect";
public static final String MUlTI_INSTANCE_APPLICATION_STATUS_CLEANUP =
@@ -768,7 +769,7 @@ public abstract class ChromeFeatureList {
/* defaultValueInTests= */ true);
public static final CachedFlag sLockBackPressHandlerAtStart =
newCachedFlag(LOCK_BACK_PRESS_HANDLER_AT_START, 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 sMostVisitedTilesCustomization =
newCachedFlag(MOST_VISITED_TILES_CUSTOMIZATION, false);
public static final CachedFlag sMayLaunchurlUsesSeparateStoragePartition =
diff --git a/chrome/browser/segmentation_platform/android/java/src/org/chromium/chrome/browser/segmentation_platform/client_util/HomeModulesRankingHelper.java b/chrome/browser/segmentation_platform/android/java/src/org/chromium/chrome/browser/segmentation_platform/client_util/HomeModulesRankingHelper.java
--- a/chrome/browser/segmentation_platform/android/java/src/org/chromium/chrome/browser/segmentation_platform/client_util/HomeModulesRankingHelper.java
+++ b/chrome/browser/segmentation_platform/android/java/src/org/chromium/chrome/browser/segmentation_platform/client_util/HomeModulesRankingHelper.java
@@ -33,6 +33,7 @@ public final class HomeModulesRankingHelper {
Profile profile,
InputContext freshnessAndEphemeralInputs,
Callback<@Nullable List<String>> callback) {
+ if ((true)) return;
HomeModulesRankingHelperJni.get()
.getClassificationResult(
profile,
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,5 @@
+CROMITE_FEATURE(kSimplifiedNTP,
+ "SimplifiedNTP",
+ base::FEATURE_ENABLED_BY_DEFAULT);
+
+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);
--