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

1211 lines
60 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 +-
.../suggestions/SuggestionsConfig.java | 2 +-
.../SuggestionsNavigationDelegate.java | 27 +-
.../tile/MostVisitedTilesCoordinator.java | 6 +-
.../tile/MostVisitedTilesGridLayout.java | 287 ++++++++++++++++++
.../tile/MostVisitedTilesMediator.java | 5 +-
.../tile/TileDragDelegateImpl.java | 6 +-
.../suggestions/tile/TileRenderer.java | 8 +-
.../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 +-
components/ntp_tiles/custom_links_store.cc | 2 -
.../Restore-Simplified-NTP-launch.inc | 12 +
.../Restore-Simplified-NTP-launch.inc | 5 +
.../Restore-Simplified-NTP-launch.inc | 1 +
35 files changed, 537 insertions(+), 53 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
@@ -555,6 +555,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
@@ -590,6 +590,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",
@@ -1002,6 +1003,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
@@ -3042,7 +3042,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
@@ -167,7 +167,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 NewTabPageCreationTracker mNewTabPageCreationTracker;
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<NewTabPageCreationTracker> newTabPageCreationTracker,
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;
mNewTabPageCreationTracker = newTabPageCreationTracker;
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. */
@@ -481,7 +484,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);
@@ -505,7 +509,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
@@ -14,6 +14,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.ImageView;
@@ -33,6 +34,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;
@@ -48,7 +50,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;
@@ -90,6 +92,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.
@@ -102,7 +106,7 @@ public class NewTabPageLayout extends LinearLayout
*/
private boolean mHasShownView;
- private boolean mSearchProviderHasLogo = true;
+ private boolean mSearchProviderHasLogo = false;
private boolean mSearchProviderIsGoogle;
private boolean mShowingNonStandardGoogleLogo;
@@ -256,6 +260,7 @@ public class NewTabPageLayout extends LinearLayout
initializeMostVisitedTilesCoordinator(
mProfile, lifecycleDispatcher, tileGroupDelegate, touchEnabledDelegate);
initializeDseIconView(searchProviderIsGoogle);
+ initializeShortcuts();
initializeSearchBoxTextView();
initializeVoiceSearchButton();
initializeLensButton();
@@ -553,7 +558,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;
@@ -621,7 +626,7 @@ public class NewTabPageLayout extends LinearLayout
&& mInitialized) {
return;
}
- mSearchProviderHasLogo = hasLogo;
+ mSearchProviderHasLogo = false;
mSearchProviderIsGoogle = isGoogle;
if (!mSearchProviderIsGoogle) {
@@ -948,6 +953,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/SuggestionsConfig.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsConfig.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsConfig.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsConfig.java
@@ -24,7 +24,7 @@ public final class SuggestionsConfig {
* 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 = 24;
/** Maximum number of custom tiles supported. In C++ backend this is `kMaxNumCustomLinks`. */
public static final int MAX_NUM_CUSTOM_LINKS = 8;
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/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,287 @@
+// 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);
+ }
+
+ public void addNonTileViewWithWidth(View view, float widthDp) {
+ super.addView(view);
+ }
+
+ /**
+ * 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
@@ -36,7 +36,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;
@@ -58,7 +58,7 @@ public class MostVisitedTilesMediator implements TileGroup.Observer, TemplateUrl
public MostVisitedTilesMediator(
Resources resources,
UiConfig uiConfig,
- MostVisitedTilesLayout mvTilesLayout,
+ MostVisitedTilesGridLayout mvTilesLayout,
ViewStub noMvPlaceholderStub,
TileRenderer renderer,
PropertyModel propertyModel,
@@ -164,7 +164,6 @@ public class MostVisitedTilesMediator implements TileGroup.Observer, TemplateUrl
@Override
public void onCustomTileCreation(Tile tile) {
- mMvTilesLayout.ensureTileIsInViewOnNextLayout(tile.getIndex());
}
public void onConfigurationChanged() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileDragDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileDragDelegateImpl.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileDragDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileDragDelegateImpl.java
@@ -64,7 +64,7 @@ class TileDragDelegateImpl implements TileGroup.TileDragDelegate, TileDragSessio
private static final float DOMINATE_TRESHOLD_RATIO = 0.4f;
// Parent container for dragged tiles.
- private final MostVisitedTilesLayout mMvTilesLayout;
+ private final MostVisitedTilesGridLayout mMvTilesLayout;
private final float mTileWidthPx;
@@ -85,7 +85,7 @@ class TileDragDelegateImpl implements TileGroup.TileDragDelegate, TileDragSessio
// Runnable to cancel tile movement that might not have completed yet, due to animation.
private @Nullable Runnable mPendingChangeCanceller;
- public TileDragDelegateImpl(MostVisitedTilesLayout mvTilesLayout) {
+ public TileDragDelegateImpl(MostVisitedTilesGridLayout mvTilesLayout) {
mMvTilesLayout = mvTilesLayout;
Resources res = mMvTilesLayout.getResources();
mTileWidthPx = res.getDimensionPixelSize(R.dimen.tile_view_width);
@@ -187,7 +187,7 @@ class TileDragDelegateImpl implements TileGroup.TileDragDelegate, TileDragSessio
@Override
public SiteSuggestion getTileViewData(TileView view) {
- return mMvTilesLayout.getTileViewData(view);
+ return null;
}
private void cancelPendingChange() {
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
@@ -171,7 +171,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.
@@ -238,7 +238,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())
@@ -315,7 +315,7 @@ public class TileRenderer {
return tileView;
}
- View buildDivider(TilesLinearLayout parent) {
+ View buildDivider(MostVisitedTilesGridLayout parent) {
return (View)
LayoutInflater.from(parent.getContext())
.inflate(R.layout.suggestions_tile_vertical_divider, parent, false);
@@ -336,7 +336,7 @@ public class TileRenderer {
}
TileView buildAddCustomLinksButton(
- TilesLinearLayout parent, TileGroup.TileSetupDelegate setupDelegate) {
+ MostVisitedTilesGridLayout parent, TileGroup.TileSetupDelegate setupDelegate) {
Resources res = mContext.getResources();
String title = res.getString(R.string.most_visited_add_new);
Drawable plusIcon =
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
@@ -24,7 +24,7 @@ import java.util.List;
* #getChildCount()} and {@link #getChildAt()}.
*/
@NullMarked
-public class TilesLinearLayout extends LinearLayout {
+class TilesLinearLayout extends LinearLayout {
private final List<TileView> mTileList = new ArrayList<TileView>();
protected float mNonTileViewsTotalWidthDp;
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
@@ -60,7 +60,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
@@ -311,6 +311,7 @@ const base::Feature* const kFeaturesExposedToJava[] = {
&kIncognitoScreenshot,
&kInstanceSwitcherV2,
&kKeyboardEscBackNavigation,
+ &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
@@ -434,6 +434,7 @@ public abstract class ChromeFeatureList {
"MayLaunchUrlUsesSeparateStoragePartition";
public static final String MINI_ORIGIN_BAR = "MiniOriginBar";
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 =
@@ -823,7 +824,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 sMiniOriginBar = newCachedFlag(MINI_ORIGIN_BAR, false, true);
public static final CachedFlag sMostVisitedTilesCustomization =
newCachedFlag(MOST_VISITED_TILES_CUSTOMIZATION, false);
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
@@ -32,6 +32,7 @@ public final class HomeModulesRankingHelper {
Profile profile,
InputContext freshnessAndEphemeralInputs,
Callback<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/components/ntp_tiles/custom_links_store.cc b/components/ntp_tiles/custom_links_store.cc
--- a/components/ntp_tiles/custom_links_store.cc
+++ b/components/ntp_tiles/custom_links_store.cc
@@ -63,8 +63,6 @@ std::vector<CustomLinksManager::Link> CustomLinksStore::RetrieveLinks() {
if (!has_recorded_first_load_stats) {
has_recorded_first_load_stats = true;
- ntp_tiles::metrics::RecordNumberOfCustomTilesOnFirstNtp(
- static_cast<int>(links.size()));
}
return links;
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);
--