Files
cromite/build/patches/Restore-Simplified-NTP-launch.patch
2026-05-19 10:48:25 +02:00

1690 lines
85 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 | 8 +
chrome/android/chrome_java_sources.gni | 2 +
.../ic_most_visited_placeholder.png | Bin 0 -> 1273 bytes
.../ic_most_visited_placeholder.png | Bin 0 -> 718 bytes
.../ic_most_visited_placeholder.png | Bin 0 -> 1519 bytes
.../ic_most_visited_placeholder.png | Bin 0 -> 2335 bytes
.../ic_most_visited_placeholder.png | Bin 0 -> 4034 bytes
.../java/res/layout/mv_tiles_container.xml | 39 +++
.../java/res/layout/mv_tiles_layout.xml | 11 +-
.../java/res/layout/new_tab_page_layout.xml | 7 +
.../new_tab_page_tile_grid_placeholder.xml | 43 +++
.../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 | 12 +-
.../feedback/ChromeFeedbackCollector.java | 1 +
.../feedback/SimplifiedNtpFeedbackSource.java | 38 +++
.../identity_disc/IdentityDiscController.java | 2 +-
.../native_page/NativePageFactory.java | 20 +-
.../NativePageNavigationDelegateImpl.java | 2 +-
.../chrome/browser/ntp/NewTabPage.java | 8 +-
.../browser/ntp/NewTabPageCoordinator.java | 28 +-
.../ntp/search/SearchBoxViewBinder.java | 1 +
.../suggestions/SuggestionsConfig.java | 2 +-
.../SuggestionsNavigationDelegate.java | 27 +-
.../tile/MostVisitedTilesCoordinator.java | 8 +-
.../tile/MostVisitedTilesGridLayout.java | 287 ++++++++++++++++++
.../tile/MostVisitedTilesMediator.java | 12 +-
.../tile/TileDragDelegateImpl.java | 18 +-
.../suggestions/tile/TileRenderer.java | 12 +-
.../suggestions/tile/TilesLinearLayout.java | 2 +-
.../engagement/important_sites_util.cc | 2 +-
.../flags/android/chrome_feature_list.cc | 1 +
.../browser/flags/ChromeFeatureList.java | 1 +
.../chrome_most_visited_sites_factory.cc | 4 -
.../client_util/HomeModulesRankingHelper.java | 1 +
.../strings/android_chrome_strings.grd | 6 +
.../core/browser/top_sites_constants.h | 2 +-
components/ntp_tiles/custom_links_store.cc | 2 -
components/omnibox/common/omnibox_features.cc | 2 +
components/search_engines/template_url.h | 4 +-
.../Restore-Simplified-NTP-launch.inc | 12 +
.../Restore-Simplified-NTP-launch.inc | 6 +
.../Restore-Simplified-NTP-launch.inc | 1 +
45 files changed, 641 insertions(+), 67 deletions(-)
create mode 100644 chrome/android/java/res/drawable-hdpi/ic_most_visited_placeholder.png
create mode 100644 chrome/android/java/res/drawable-mdpi/ic_most_visited_placeholder.png
create mode 100644 chrome/android/java/res/drawable-xhdpi/ic_most_visited_placeholder.png
create mode 100644 chrome/android/java/res/drawable-xxhdpi/ic_most_visited_placeholder.png
create mode 100644 chrome/android/java/res/drawable-xxxhdpi/ic_most_visited_placeholder.png
create mode 100644 chrome/android/java/res/layout/mv_tiles_container.xml
create mode 100644 chrome/android/java/res/layout/new_tab_page_tile_grid_placeholder.xml
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
@@ -53,6 +53,11 @@ chrome_java_resources = [
"java/res/drawable-hdpi/ic_exit_to_app_white_24dp.png",
"java/res/drawable-hdpi/ic_file_download_white_24dp.png",
"java/res/drawable-hdpi/ic_link_grey600_36dp.png",
+ "java/res/drawable-hdpi/ic_most_visited_placeholder.png",
+ "java/res/drawable-mdpi/ic_most_visited_placeholder.png",
+ "java/res/drawable-xhdpi/ic_most_visited_placeholder.png",
+ "java/res/drawable-xxhdpi/ic_most_visited_placeholder.png",
+ "java/res/drawable-xxxhdpi/ic_most_visited_placeholder.png",
"java/res/drawable-hdpi/ic_phone_googblue_36dp.png",
"java/res/drawable-hdpi/ic_photo_camera.png",
"java/res/drawable-hdpi/ic_place_googblue_36dp.png",
@@ -553,6 +558,7 @@ chrome_java_resources = [
"java/res/layout/manage_space_activity.xml",
"java/res/layout/material_tooltip.xml",
"java/res/layout/multiline_spinner_item.xml",
+ "java/res/layout/mv_tiles_container.xml",
"java/res/layout/mv_tiles_layout.xml",
"java/res/layout/navigation_bubble.xml",
"java/res/layout/navigation_sheet.xml",
@@ -561,8 +567,10 @@ chrome_java_resources = [
"java/res/layout/new_background_tab_animation_tab_switcher_icon.xml",
"java/res/layout/new_custom_tab_toolbar.xml",
"java/res/layout/new_tab_page_incognito.xml",
+ "java/res/layout/new_tab_page_tile_grid_placeholder.xml",
"java/res/layout/new_tab_page_layout.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
@@ -660,6 +660,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",
@@ -1111,6 +1112,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/drawable-hdpi/ic_most_visited_placeholder.png b/chrome/android/java/res/drawable-hdpi/ic_most_visited_placeholder.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d71af1433341fc4552e9b6c7a96cd6911bcffeb
GIT binary patch
literal 1273
zcmV<V1P1$wP)<h;3K|Lk000e1NJLTq00341003491ONa4|6i$m000EQNkl<ZcmdQ{
zu}d6j6n{1;G&vA*xL_kBYjr8sV~bnPTvEtE$P$}07DwP#u(a_01S=uh*$8(<K(bv_
z4y^`nci!*a3VX17kb@vLDU8@8qD1t#%f4@R5;Ixdoo{9xf3MjY_WS0?H*em1zaK>b
zNh8lQSdvZDup|3&{2}(SgPLq&iD!_PG+j2_TbRT$cICf|1G`wpq<f3H4;kQTR9jN}
z_d~QIUFB&Rpl$*8WDO^02)xFM%%M;om9&%E=%XI$+30gpk}i*;Aahv3>ofm9ku}_-
zxFHYVe)7<FQp8kgnA$*T7*kTjyH8fT@*utp&7$Hz=v3BuVzrk##A+{3$U08_eJXC2
zqDHA7i+&y+$~+H}1$a>A<*=FGSS<BZbl`F9nXPevS?4B2fIq&*EDpR~_jsJ5K=B$c
z_%H3b-H8TI7|)w~^Fr|&*#Sec<q>@)V-y2q46i)GTNtA7;7qgN<C$}vVuEuW&zg;c
zGZYTx`|?(|I6{G91`0S*!f(s>!+limmFgReP!}NI;*CD<J&$*Ms)nj;^KI%9__k~t
zx*eS^XS@WcIVtKQoD^y%8QRWW40)f`wxQZxy58yTVyLaUDqAL3trEZ@8BFfVRvUGf
z7rY8ELYD-L;K;Oz3u}PaPkyFL1PUID@$<)(J<|f{l405e_Rbk`uxJ{qeYdjjYNiQe
zvE{t#4S{2n0LYjbAY074sF=x$5&|=kq4Gt+V&+vIq=bM6y?Hk%evG!lEF}n-HCipG
zSXHp73P=o`n@0S6ri5ipZ$71j0Z;W1*UnfLIB6)>PV*Hn@bco2qE+6Ws?RX+@z%8R
zU#AX%dRxX(g)AWJ+RLV?31bBDL=wsJgfX3bd(F5jtG(gK@?-a#&jU}C=wEvE2zAuM
zCc|p4adA9L50kpFZWfAch5~T!ek?j});pV!kfN@iG>=@?i>aiN#gwjJHW#W3O2hGx
zRevkP8TS#YsD^oerD3BT)U`IIC6OIj`JNy0!%}~ctN~~APMt!)GfdNjyl%2$OV*4*
zoQs9*imuHQ|DvqtVj+8gN;Bl|@ML99_nsjv=_Z9Z$OZ%T@G=KWB%6&N<<TUQEsyHz
zP4aAov@Kb_!#U2CZ;;~muQ+!$@FYB0uL#r#JB=Ss%9d<v*neP7O4sg?>^FXF^d*_>
zMxVa@eUjsbETf(zlcgS&vd349>=jCbEA@dzQ@UE9d_&9D9YfZ>bVbt?T7Yv#DHyW$
zO~G%sNha&J+lU4k?OJZu&GHX_{^Z_uvyDJrhnU|CS^GgInh{aKKL#d&s7FM9_)aoe
zZ}^T-*0|rPaQR0L@e);yUxQ>VWQ~Pjw5YQ-g3*)W2_@@G@z_j`VDMu@*23h7**>yY
z3ch`0Va!>OwJ_%5wLF9I!rJmou9+<J0W<mk_U)JkKp+UBs0lEFC9rTd&Jqa)>jEv5
z(=64o$^7JO%)IY9(_gD*dg=iJyOvO=9qbN89nG){UpOKTdmI5{Cos^1qEZlqX2AO%
z@jh!f8Jpnb5J|09UiU7N%E!KZMok3j_4NN-68c{eRYV_+DxxP*1tC|#gg}_YiXE@b
jEHDo)+h=gu{t7N%^^-?s9Fd&I00000NkvXXu0mjfGY4n(
literal 0
HcmV?d00001
diff --git a/chrome/android/java/res/drawable-mdpi/ic_most_visited_placeholder.png b/chrome/android/java/res/drawable-mdpi/ic_most_visited_placeholder.png
new file mode 100644
index 0000000000000000000000000000000000000000..f057df12978c838312853d20a9a700a9a2aaf821
GIT binary patch
literal 718
zcmV;<0x|uGP)<h;3K|Lk000e1NJLTq0021v0021%1ONa4CJ{>x0007&Nkl<ZcwWVs
zKWidE7{=cSiJg^=U0RFuUY|M<yYoB5R<yDZ@dMZ--{5Qv1hz>bh}q}4Ua?PMqbOvt
z+xQ;r1%`0(oLzUa&s5s{nA!K=JR|m+l>9pS9C5}a-VoxAOU^h#->*+flCDr@4-4w2
z_5S%c7VM#%2JH+r@B^~tBbt5{<#Ex=i+K5Q5oN!MCLg)|024JiljOn;=Mikp!L-uJ
z$w75;(+US%N8mYblHo4#6ya8A3@^k=!wWRHqEhjM%ecU6Y^dC!>lGxHyaKx1QL({w
z9N-;7Dt;x6!%2xlDni^@;qK4zK;<57IZ0@9PsPLi`ElSg6~W7`oUE5y1XMg9fkr!g
z^{*rq`B!|U;^DvFkcz+n(||@hy*nJGA@{aNYJa@kBgFOBdAOnaElFK|i;B$`c^W1D
zP@E`AnWukCn{t<WKQMW^qkb-fXPi^f6=y=1%DE}{f*O@8uiy^p6}Y0JW{|(BXoypx
zK?O|%R<4hA3+ka|+hw?>el&6Rs2qs6MT&4hWiJ9?L7i4?kYE2}i=9@eSVRF#<+hV^
zkL={QrA|uX*Qp$dBuCm~IimV?L7$4I9nyf3A<?9w|Cd}%f{Y(Vel<E#&ZsCmN1Ak;
z376Dy(Gq!3cF1v&%B3Kndin1`dU+}WLCALzw@4%I5q|$J-!k}?u_E>`Do(_jymX8-
zc^SL<n0!oJeN2sYkK`lO|7kjj<M1(^#Pmz&$d?~fEK-;X%(9*e%<SV5X=a}cCcF&h
z*bJui4DKY^-Mq~G67BSXXq)?GmbYm4UO~o=NcO&uakox2D*Tplx2!!p4qbbA?wv~a
zer(3Bb8>Hebii95S$OMNz91xhCkYTDNcK+h2fYj#{p3=OZvX%Q07*qoM6N<$f{avI
AQ2+n{
literal 0
HcmV?d00001
diff --git a/chrome/android/java/res/drawable-xhdpi/ic_most_visited_placeholder.png b/chrome/android/java/res/drawable-xhdpi/ic_most_visited_placeholder.png
new file mode 100644
index 0000000000000000000000000000000000000000..12e3d77ef68c092977975d7ac8e777304250b20d
GIT binary patch
literal 1519
zcmV<L1rYj)P)<h;3K|Lk000e1NJLTq0043T0043b1ONa4CDcv!000HHNkl<ZcwX(D
zJx?1=5Xa{U5MCr2A}pmr!h|xw2S7w_k_H5bf{xBWi)bH&Q95LIG$3ju++q-gB@5r}
z&NLAcG)Rb-6j2(26h#U$Ao3LK-kw?DF~)b?ZSH?9ob-d)+1Z)dIq*{1I_l<wG>a>=
zjSTnjgwCi$B|5_s+(Sm&xI(jhkh-&V5H{uC&=@V@K3&qE3ZF~drzIN8zk%S3`Y}Vh
zbVGltd~RqLGt>{k6n{qxboBoic!gILz#h>8e+R))p`K45yBFvh4=INknzR$Fk9Dya
zZw3J1%`C>cSf8DsNz70V5ApgwRAhXjP!BJytwugY#~NOVikRXbwi=)Co)4I!B9%1M
zV?L$c<GVIma0b8K!TX7;?BhmD_3z}LaFu?RgW@-w5%2U@Y#2}PthG%XFErI;0W{$_
zZkDfIJY~b+r*=9iR|fct7K?A8#wxz0Mf~LkrQA-ZPi}_h@WKUnjw#*-9*MVM3eOcL
z{-!z4U6I{E+y!`n^L8tEEV~uw-G5f%b_aMT9Ks(i#7!#>KFNyXrozM@I0Rm3xdGEI
zz^{B1d=?+YuP)H^azpJ+Ca(}_O&F=qvRi4*g_*DEQeiRt;#!AEctK%Otxx>IVl~?^
z@K7Ss0rkKOi+bq5!91+Vro!LT_h%c3my72+fB$T+=0aT0zJ`D(`<k)}(~3WDEh<A@
zO1**rDfNn$l+m(S^+uuG&1VRp@UwD3c58L}qO$uX2&i2D&3qO6CT1MOtY)Y|GTN+z
znR#*mr#xyE?#5Raq%01Ho)m^VG3r4Tw(fr%bRc6|yQA{M6qnHr^*{(jJx&zFD?EtN
zoMWm<2#GN1c#yfuf;br)u0e=IYts5E2=pi?4^!G|4EV})4q`cYTzo{DDj$K6iH}N?
zWy6mr8BgV@A3`XZJ;2jP5|}t6?b?b%2xY~kKf##?v)D3KjPnpu;k-;oKah3DX_;iy
zTuzwW&$*zOzCQ#w7LX|ju`nfTD0)}`d_rc!c^iaSyiI1^`Gf}G6yFvh<f27c_|r<L
zvTXC*nnpGC<yzNJWU1&*8J8B+{up*hwO`UgIpmRm95(`TTo&csi2bsJT4*u>ve4v|
zar?DY2d)Ct3i2sGQ+rrk)lwp~D+1e(ra<yf;+?xrYmw-?DQ&cv0=dy5S}blv`xA``
z>LP$CkN{K^RAXhiOH92Kq!+N5D$5z;zF3h1CPDHK!u9Om2IiNy-BVkQUO-A9zah68
zMVHrQp&qDP7EJ(5f&_4iRo%b`W%|cINI!xDm6GFwK(n&Zz%WQv&6x#U5s*paAd`Y@
z1!(&g(oUELX(z<{wn5fCtX>Zwef(WrR<D5MfO`TmZX9G>nCl+k$t`5D-89HzyMR0a
zIunkz*)&MrEZ%npx6wLY0hk5}AaXq=33+WK<h6kOE6i0o9u_kVlEtLsakdcFWgKLe
z+CrGA!2s(Mkj%5Nt{N!M!a5b8n+8dfGC)^Ht&A~{`cX?AnoWaLhi1>y9|}f2ey2aQ
zM3yO#Dv_0~(^8VAK&q6amRvRjQco_cGJ#3KfGQJc1s?+-wStdUx-$S$E8S^DSW_TX
z5jG&@bp7$5oUS!Sgd0+CjL=(LOn_7^E`e!Q(jO0+l}v9tGrxh*{8muon|k@w-`k#T
zextqlS0<F$uygrk)PTz`CSPNUE~J@owGjV}E{U3S-8Z_pt%PX@b3Mpc@NwNiOh>~M
z%ovLi4LAw^sG6P5Xy{O7|IHwekFw&?Ah2kp+kN|HrffLh2>2{MQZ}3~v)mAkS&Rl|
z27C1Bg&2Jr4Y94E8}NG^u_vxB8Z51{?$ZyA2xkLN84=C~9vTsj(_4+fANHQcq@A#O
zt$49r4tp=QTXCz`PGAz#FFx!&8r!eyA2U9{5PeERU#;q+D8%o66ot6@D2lf$??28P
VYD9idM-c!3002ovPDHLkV1iD~y2t<k
literal 0
HcmV?d00001
diff --git a/chrome/android/java/res/drawable-xxhdpi/ic_most_visited_placeholder.png b/chrome/android/java/res/drawable-xxhdpi/ic_most_visited_placeholder.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ce230c9b20b858ed2da0117abc52f15b9b80d5a
GIT binary patch
literal 2335
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
APXGV_
literal 0
HcmV?d00001
diff --git a/chrome/android/java/res/drawable-xxxhdpi/ic_most_visited_placeholder.png b/chrome/android/java/res/drawable-xxxhdpi/ic_most_visited_placeholder.png
new file mode 100644
index 0000000000000000000000000000000000000000..14b205657b6b7a46bc64c09f3277daffd5998ef9
GIT binary patch
literal 4034
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
literal 0
HcmV?d00001
diff --git a/chrome/android/java/res/layout/mv_tiles_container.xml b/chrome/android/java/res/layout/mv_tiles_container.xml
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/res/layout/mv_tiles_container.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2023 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<!-- A site suggestion tile. -->
+<FrameLayout android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/mv_tiles_container"
+ android:visibility="gone"
+ android:orientation="vertical"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginTop="@dimen/mvt_container_top_margin"
+ android:layout_marginLeft="@dimen/mvt_container_lateral_margin"
+ android:layout_marginRight="@dimen/mvt_container_lateral_margin"
+ android:paddingTop="@dimen/mvt_container_top_padding"
+ android:paddingBottom="@dimen/mvt_container_bottom_padding"
+ android:background="@drawable/home_surface_ui_background"
+ app:layout_scrollFlags="scroll">
+
+ <ViewStub
+ android:id="@+id/mv_tiles_layout_stub"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout="@layout/mv_tiles_layout" />
+
+ <!-- Site suggestion tile grid placeholder -->
+ <ViewStub
+ android:id="@+id/mv_tiles_placeholder_stub"
+ android:layout_gravity="center_horizontal"
+ 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" />
+</FrameLayout>
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
@@ -13,9 +13,10 @@ found in the LICENSE file.
android:paddingBottom="@dimen/mvt_container_bottom_padding"
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" />
+<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:layout_gravity="center_horizontal" />
</HorizontalScrollView>
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
@@ -42,6 +42,13 @@ found in the LICENSE file.
/>
<!-- Most Visited Tiles -->
+ <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" />
+
<ViewStub
android:id="@+id/mv_tiles_layout_stub"
android:inflatedId="@+id/mv_tiles_container"
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
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/res/layout/new_tab_page_tile_grid_placeholder.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+
+<!-- The view shown when there are no most visited items in document mode:
+ "Nothing to see here..." -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:padding="16dp"
+ android:orientation="vertical">
+
+ <ImageView
+ 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="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="8dp"
+ android:color="#c8c8c8"
+ android:gravity="center_horizontal"
+ android:text="@string/most_visited_placeholder_title"
+ android:textSize="16sp" />
+
+ <TextView
+ 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>
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/ic_star_filled_24dp"
+ 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
@@ -125,6 +125,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_top_padding">17dp</dimen>
<dimen name="mvt_container_bottom_padding">22dp</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
@@ -3738,7 +3738,8 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt
getStartupMetricsTracker(),
mRootUiCoordinator.getExclusiveAccessManager(),
mBackPressManager,
- mRecentlyClosedEntriesManager);
+ mRecentlyClosedEntriesManager,
+ 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
@@ -14,6 +14,7 @@ import org.chromium.build.annotations.Nullable;
import org.chromium.chrome.browser.app.ChromeActivity;
import org.chromium.chrome.browser.app.tab_activity_glue.ActivityTabWebContentsDelegateAndroid;
import org.chromium.chrome.browser.back_press.BackPressManager;
+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;
@@ -56,6 +57,8 @@ import org.chromium.ui.modaldialog.ModalDialogManager;
import java.util.List;
import java.util.function.Supplier;
+import androidx.annotation.NonNull;
+
/**
* {@link TabDelegateFactory} class to be used in all {@link Tab} instances owned by a {@link
* ChromeTabbedActivity}.
@@ -89,6 +92,8 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory {
private final TopInsetProvider mTopInsetProvider;
private final StartupMetricsTracker mStartupMetricsTracker;
private final @Nullable ExclusiveAccessManager mExclusiveAccessManager;
+ private final MonotonicObservableSupplier<BookmarkManagerOpener> mBookmarkManagerOpenerSupplier;
+
private @Nullable NativePageFactory mNativePageFactory;
private final BackPressManager mBackPressManager;
private final RecentlyClosedEntriesManager mRecentlyClosedEntriesManager;
@@ -122,7 +127,8 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory {
StartupMetricsTracker startupMetricsTracker,
@Nullable ExclusiveAccessManager exclusiveAccessManager,
BackPressManager backPressManager,
- RecentlyClosedEntriesManager recentlyClosedEntriesManager) {
+ RecentlyClosedEntriesManager recentlyClosedEntriesManager,
+ @NonNull MonotonicObservableSupplier<BookmarkManagerOpener> bookmarkManagerOpenerSupplier) {
mActivity = activity;
mAppBrowserControlsVisibilityDelegate = appBrowserControlsVisibilityDelegate;
mShareDelegateSupplier = shareDelegateSupplier;
@@ -152,6 +158,7 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory {
mExclusiveAccessManager = exclusiveAccessManager;
mBackPressManager = backPressManager;
mRecentlyClosedEntriesManager = recentlyClosedEntriesManager;
+ mBookmarkManagerOpenerSupplier = bookmarkManagerOpenerSupplier;
}
@Override
@@ -224,7 +231,8 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory {
mTopInsetProvider,
mStartupMetricsTracker,
mBackPressManager,
- mRecentlyClosedEntriesManager);
+ mRecentlyClosedEntriesManager,
+ 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
@@ -70,6 +70,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
@@ -204,7 +204,7 @@ public class IdentityDiscController
mButtonData.setButtonSpec(
buttonSpecWithDrawableAndDescription(mButtonData.getButtonSpec(), profileData));
- mButtonData.setCanShow(true);
+ mButtonData.setCanShow(false);
}
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
@@ -17,6 +17,7 @@ import android.graphics.Rect;
import android.view.View;
import androidx.annotation.VisibleForTesting;
+import androidx.annotation.NonNull;
import org.chromium.base.lifetime.Destroyable;
import org.chromium.base.metrics.RecordUserAction;
@@ -33,6 +34,7 @@ import org.chromium.chrome.browser.app.ChromeActivity;
import org.chromium.chrome.browser.app.download.home.DownloadPage;
import org.chromium.chrome.browser.back_press.BackPressManager;
import org.chromium.chrome.browser.bookmarks.BookmarkPage;
+import org.chromium.chrome.browser.bookmarks.BookmarkManagerOpener;
import org.chromium.chrome.browser.browser_controls.BrowserControlsMarginAdapter;
import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
import org.chromium.chrome.browser.contextual_tasks.ContextualTasksNativePage;
@@ -102,6 +104,7 @@ public class NativePageFactory {
private final MonotonicObservableSupplier<EdgeToEdgeController> mEdgeToEdgeControllerSupplier;
private final TopInsetProvider mTopInsetProvider;
private final StartupMetricsTracker mStartupMetricsTracker;
+ private final MonotonicObservableSupplier<BookmarkManagerOpener> mBookmarkManagerOpenerSupplier;
private @Nullable NewTabPageCreationTracker mNewTabPageCreationTracker;
private @Nullable NativePageBuilder mNativePageBuilder;
@@ -129,7 +132,8 @@ public class NativePageFactory {
TopInsetProvider topInsetProvider,
StartupMetricsTracker startupMetricsTracker,
BackPressManager backPressManager,
- RecentlyClosedEntriesManager recentlyClosedEntriesManager) {
+ RecentlyClosedEntriesManager recentlyClosedEntriesManager,
+ MonotonicObservableSupplier<BookmarkManagerOpener> bookmarkManagerOpenerSupplier) {
mActivity = activity;
mBottomSheetController = sheetController;
mBrowserControlsManager = browserControlsManager;
@@ -150,6 +154,7 @@ public class NativePageFactory {
mStartupMetricsTracker = startupMetricsTracker;
mBackPressManager = backPressManager;
mRecentlyClosedEntriesManager = recentlyClosedEntriesManager;
+ mBookmarkManagerOpenerSupplier = bookmarkManagerOpenerSupplier;
}
private NativePageBuilder getBuilder() {
@@ -176,7 +181,8 @@ public class NativePageFactory {
mTopInsetProvider,
mStartupMetricsTracker,
mBackPressManager,
- mRecentlyClosedEntriesManager);
+ mRecentlyClosedEntriesManager,
+ mBookmarkManagerOpenerSupplier);
}
return mNativePageBuilder;
}
@@ -213,9 +219,10 @@ public class NativePageFactory {
private final StartupMetricsTracker mStartupMetricsTracker;
private final BackPressManager mBackPressManager;
private final RecentlyClosedEntriesManager mRecentlyClosedEntriesManager;
+ private final MonotonicObservableSupplier<BookmarkManagerOpener> mBookmarkManagerOpenerSupplier;
public NativePageBuilder(
- Activity activity,
+ ChromeActivity activity,
Supplier<NewTabPageCreationTracker> newTabPageCreationTracker,
BottomSheetController sheetController,
BrowserControlsManager browserControlsManager,
@@ -235,7 +242,8 @@ public class NativePageFactory {
TopInsetProvider topInsetProvider,
StartupMetricsTracker startupMetricsTracker,
BackPressManager backPressManager,
- RecentlyClosedEntriesManager recentlyClosedEntriesManager) {
+ RecentlyClosedEntriesManager recentlyClosedEntriesManager,
+ MonotonicObservableSupplier<BookmarkManagerOpener> bookmarkManagerOpenerSupplier) {
mActivity = activity;
mNewTabPageCreationTracker = newTabPageCreationTracker;
mBottomSheetController = sheetController;
@@ -257,6 +265,7 @@ public class NativePageFactory {
mStartupMetricsTracker = startupMetricsTracker;
mBackPressManager = backPressManager;
mRecentlyClosedEntriesManager = recentlyClosedEntriesManager;
+ mBookmarkManagerOpenerSupplier = bookmarkManagerOpenerSupplier;
}
protected NativePage buildNewTabPage(Tab tab, String url) {
@@ -299,7 +308,8 @@ public class NativePageFactory {
mModuleRegistrySupplier,
mEdgeToEdgeControllerSupplier,
mTopInsetProvider,
- 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
@@ -28,7 +28,7 @@ import org.chromium.ui.mojom.WindowOpenDisposition;
/** {@link NativePageNavigationDelegate} implementation. */
@NullMarked
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
@@ -110,6 +110,9 @@ import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.modaldialog.ModalDialogManager;
+import androidx.annotation.NonNull;
+import org.chromium.chrome.browser.bookmarks.BookmarkManagerOpener;
+
import java.util.List;
import java.util.function.Supplier;
@@ -402,7 +405,8 @@ public class NewTabPage
OneshotSupplier<ModuleRegistry> moduleRegistrySupplier,
MonotonicObservableSupplier<EdgeToEdgeController> edgeToEdgeControllerSupplier,
TopInsetProvider topInsetProvider,
- StartupMetricsTracker startupMetricsTracker) {
+ StartupMetricsTracker startupMetricsTracker,
+ MonotonicObservableSupplier<BookmarkManagerOpener> bookmarkManagerOpenerSupplier) {
mConstructedTimeNs = System.nanoTime();
TraceEvent.begin(TAG);
@@ -422,7 +426,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/NewTabPageCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageCoordinator.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageCoordinator.java
@@ -13,6 +13,7 @@ import android.graphics.Point;
import android.graphics.Rect;
import android.text.Editable;
import android.view.DragEvent;
+import android.view.ViewStub;
import android.view.View;
import android.view.View.OnLayoutChangeListener;
import android.view.ViewGroup;
@@ -64,6 +65,7 @@ import org.chromium.chrome.browser.setup_list.SetupListModuleUtils;
import org.chromium.chrome.browser.signin.SigninAndHistorySyncActivityLauncherImpl;
import org.chromium.chrome.browser.suggestions.tile.MostVisitedTilesCoordinator;
import org.chromium.chrome.browser.suggestions.tile.TileGroup;
+import org.chromium.chrome.browser.suggestions.tile.MostVisitedTilesGridLayout;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tab.TabSelectionType;
@@ -147,6 +149,8 @@ public class NewTabPageCoordinator implements ModuleDelegateHost {
private SetupListManager.@Nullable Observer mSetupListObserver;
private @Nullable Point mContextMenuStartPosition;
+ 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.
@@ -159,14 +163,14 @@ public class NewTabPageCoordinator implements ModuleDelegateHost {
*/
private boolean mHasShownView;
- private boolean mSearchProviderHasLogo = true;
+ private boolean mSearchProviderHasLogo = false;
private boolean mSearchProviderIsGoogle;
private boolean mShowingNonStandardGoogleLogo;
private boolean mInitialized;
private float mUrlFocusChangePercent;
- private boolean mDisableUrlFocusChangeAnimations;
+ private boolean mDisableUrlFocusChangeAnimations = true;
/** Flag used to request some layout changes after the next layout pass is completed. */
private boolean mTileCountChanged;
@@ -345,6 +349,7 @@ public class NewTabPageCoordinator implements ModuleDelegateHost {
mSearchEngineUtils.addIconObserver(mSearchEngineIconObserver);
setSearchBoxTextAppearance();
+ initializeShortcuts();
initializeSearchBoxTextView();
initializeVoiceSearchButton();
initializeLensButton();
@@ -742,6 +747,8 @@ public class NewTabPageCoordinator implements ModuleDelegateHost {
* @param isGoogle Whether the search provider is Google.
*/
void setSearchProviderInfo(boolean hasLogo, boolean isGoogle) {
+ hasLogo = false;
+ isGoogle = false;
if (hasLogo == mSearchProviderHasLogo
&& isGoogle == mSearchProviderIsGoogle
&& mInitialized) {
@@ -807,6 +814,7 @@ public class NewTabPageCoordinator implements ModuleDelegateHost {
* @param disable Whether to disable the animations.
*/
void setUrlFocusAnimationsDisabled(boolean disable) {
+ disable = true;
if (disable == mDisableUrlFocusChangeAnimations) return;
mDisableUrlFocusChangeAnimations = disable;
if (!disable) onUrlFocusAnimationChanged();
@@ -1335,6 +1343,22 @@ public class NewTabPageCoordinator implements ModuleDelegateHost {
}
}
+ private void initializeShortcuts() {
+ if (!ChromeFeatureList.isEnabled(ChromeFeatureList.SIMPLIFIED_NTP)) {
+ return;
+ }
+
+ ViewStub shortcutsStub = mNewTabPageLayout.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(int width) {
int searchBoxWidth = width - mSearchBoxTwoSideMargin;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/search/SearchBoxViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/search/SearchBoxViewBinder.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/search/SearchBoxViewBinder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/search/SearchBoxViewBinder.java
@@ -31,6 +31,7 @@ class SearchBoxViewBinder
View searchBoxContainer = searchBoxlayout.findViewById(R.id.search_box_container);
final TextView searchBoxTextView = searchBoxlayout.findViewById(R.id.search_box_text);
+ searchBoxlayout.setVisibility(View.GONE);
if (SearchBoxProperties.ALPHA == propertyKey) {
searchBoxlayout.setAlpha(model.get(SearchBoxProperties.ALPHA));
} else if (SearchBoxProperties.VOICE_SEARCH_COLOR_STATE_LIST == propertyKey) {
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
@@ -26,7 +26,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 = 8;
+ 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
@@ -23,17 +23,42 @@ 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.MonotonicObservableSupplier;
+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. */
@NullMarked
public class SuggestionsNavigationDelegate extends NativePageNavigationDelegateImpl {
+ private final MonotonicObservableSupplier<BookmarkManagerOpener> mBookmarkManagerOpenerSupplier;
+
public SuggestionsNavigationDelegate(
Activity activity,
Profile profile,
NativePageHost host,
TabModelSelector tabModelSelector,
- Tab tab) {
+ Tab tab,
+ MonotonicObservableSupplier<BookmarkManagerOpener> bookmarkManagerOpenerSupplier) {
super(activity, profile, host, tabModelSelector, tab);
+ mBookmarkManagerOpenerSupplier = bookmarkManagerOpenerSupplier;
+ }
+
+ public void navigateToBookmarks() {
+ mBookmarkManagerOpenerSupplier.get()
+ .showBookmarkManager(mActivity, mTab, 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
@@ -70,15 +70,11 @@ public class MostVisitedTilesCoordinator implements ConfigurationChangedObserver
mActivityLifecycleDispatcher = activityLifecycleDispatcher;
mMvTilesContainerLayout = mvTilesContainerLayout;
- 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);
@@ -88,7 +84,7 @@ public class MostVisitedTilesCoordinator implements ConfigurationChangedObserver
new MostVisitedTilesMediator(
activity,
mUiConfig,
- mvTilesContainerLayout,
+ tilesLayout,
mRenderer,
propertyModel,
isTablet,
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
@@ -52,7 +52,7 @@ public class MostVisitedTilesMediator implements TileGroup.Observer {
private final Resources mResources;
private final UiConfig mUiConfig;
private final View mMvTilesContainerLayout;
- private final MostVisitedTilesLayout mMvTilesLayout;
+ private final MostVisitedTilesGridLayout mMvTilesLayout;
private final PropertyModel mModel;
private final boolean mIsTablet;
private final int mTileViewLandscapePadding;
@@ -76,7 +76,7 @@ public class MostVisitedTilesMediator implements TileGroup.Observer {
public MostVisitedTilesMediator(
Context context,
UiConfig uiConfig,
- View mvTilesContainerLayout,
+ MostVisitedTilesGridLayout mvTilesContainerLayout,
TileRenderer renderer,
PropertyModel propertyModel,
boolean isTablet,
@@ -223,12 +223,10 @@ public class MostVisitedTilesMediator implements TileGroup.Observer {
@Override
public void onCustomTileCreation(Tile tile) {
- mMvTilesLayout.ensureTileIsInViewOnNextLayout(tile.getIndex());
}
@Override
public void onCustomTileReorder(int newPos) {
- mMvTilesLayout.ensureTileIsInViewOnNextLayout(newPos);
}
public void onConfigurationChanged() {
@@ -264,10 +262,6 @@ public class MostVisitedTilesMediator implements TileGroup.Observer {
* recalculate the value of |mMvtContentFits|.
*/
void updateMvtOnTablet(@Nullable Integer totalWidth) {
- if (totalWidth != null) {
- mMvtContentFits = mMvTilesLayout.contentFitsOnTablet(totalWidth);
- }
-
MarginLayoutParams marginLayoutParams =
(MarginLayoutParams) mMvTilesContainerLayout.getLayoutParams();
marginLayoutParams.width =
@@ -379,7 +373,5 @@ public class MostVisitedTilesMediator implements TileGroup.Observer {
double firstTileScore = mTileGroup.getSuggestionScore(firstTile.getUrl());
if (firstTileScore < MVT_CUSTOMIZATION_IPH_TILE_SCORE_THRESHOULD) return;
-
- mMvTilesLayout.triggerCustomizationIph(mUserEducationHelper);
}
}
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
@@ -77,7 +77,7 @@ class TileDragDelegateImpl implements TileDragDelegate, TileDragSession.Delegate
private static final float DOMINATE_TRESHOLD_RATIO = 0.4f;
// Parent container for dragged tiles.
- private final MostVisitedTilesLayout mMvTilesLayout;
+ private final MostVisitedTilesGridLayout mMvTilesLayout;
private final @Px float mTileWidthPx;
@@ -103,7 +103,7 @@ class TileDragDelegateImpl implements TileDragDelegate, TileDragSession.Delegate
// (e.g., for Swap Flow, to allow fast repeated keyboard-triggered swaps) the action.
private @Nullable Runnable mPendingChangeFinalizer;
- public TileDragDelegateImpl(MostVisitedTilesLayout mvTilesLayout) {
+ public TileDragDelegateImpl(MostVisitedTilesGridLayout mvTilesLayout) {
mMvTilesLayout = mvTilesLayout;
Resources res = mMvTilesLayout.getResources();
mTileWidthPx = res.getDimensionPixelSize(R.dimen.tile_view_width);
@@ -228,18 +228,10 @@ class TileDragDelegateImpl implements TileDragDelegate, TileDragSession.Delegate
@Override
public void showDivider(boolean isAnimated) {
- SuggestionsTileVerticalDivider divider = mMvTilesLayout.getDividerMaybeNull();
- if (divider != null) {
- divider.show(isAnimated);
- }
}
@Override
public void hideDivider(boolean isAnimated) {
- SuggestionsTileVerticalDivider divider = mMvTilesLayout.getDividerMaybeNull();
- if (divider != null) {
- divider.hide(isAnimated);
- }
}
@Override
@@ -275,7 +267,7 @@ class TileDragDelegateImpl implements TileDragDelegate, TileDragSession.Delegate
public boolean isAutoScrollEnabled() {
// TODO(b/431765443): Return !DeviceInfo.isDesktop() if auto-scroll should be disabled on
// desktop Android browsers.
- return true;
+ return false;
}
@Override
@@ -285,12 +277,12 @@ class TileDragDelegateImpl implements TileDragDelegate, TileDragSession.Delegate
@Override
public SiteSuggestion getTileViewData(TileView view) {
- return mMvTilesLayout.getTileViewData(view);
+ return null;
}
@Override
public HorizontalScrollView getOuterView() {
- return mMvTilesLayout.getScrollView();
+ return null;
}
List<TileView> getDraggableTileViews() {
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
@@ -172,7 +172,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.
@@ -210,7 +210,7 @@ public class TileRenderer {
if (prevTile != null
&& (prevTile.getData().source == TileSource.CUSTOM_LINKS)
!= (tile.getData().source == TileSource.CUSTOM_LINKS)) {
- parent.addDivider(buildDivider(parent));
+ //parent.addDivider(buildDivider(parent));
}
parent.addTile(tileView);
if (focusedUrl != null && focusedUrl.equals(tile.getUrl().getSpec())) {
@@ -226,7 +226,7 @@ public class TileRenderer {
if (shouldShowAddNewButton(sectionTiles)) {
TileView addCustomLinksButton = buildAddCustomLinksButton(parent, setupDelegate);
- parent.addUiView(addCustomLinksButton, mTileWidth);
+ //parent.addUiView(addCustomLinksButton, mTileWidth);
}
}
}
@@ -261,7 +261,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())
@@ -324,7 +324,7 @@ public class TileRenderer {
return tileView;
}
- SuggestionsTileVerticalDivider buildDivider(TilesLinearLayout parent) {
+ SuggestionsTileVerticalDivider buildDivider(MostVisitedTilesGridLayout parent) {
return (SuggestionsTileVerticalDivider)
LayoutInflater.from(parent.getContext())
.inflate(R.layout.suggestions_tile_vertical_divider, parent, false);
@@ -345,7 +345,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
@@ -32,7 +32,7 @@ import java.util.List;
* #getChildAt()}.
*/
@NullMarked
-public class TilesLinearLayout extends LinearLayout {
+class TilesLinearLayout extends LinearLayout {
private final List<TileView> mTileList = new ArrayList<>();
protected int mTileAndUiViewCount;
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
@@ -59,7 +59,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
@@ -382,6 +382,7 @@ const base::Feature* const kFeaturesExposedToJava[] = {
&kKeyboardEscBackNavigation,
&kLaunchCauseScreenOffFix,
&kLensOnQuickActionSearchWidget,
+ &kSimplifiedNTP,
&kLinkHoverStatusBar,
&kLoadAllTabsAtStartup,
&kLoadNativeEarly,
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
@@ -530,6 +530,7 @@ public abstract class ChromeFeatureList {
"MayLaunchUrlUsesSeparateStoragePartition";
public static final String MEDIA_INDICATORS_ANDROID = "MediaIndicatorsAndroid";
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 MOVE_TO_FRONT_IN_LAUNCH_INTENT_DISPATCHER =
diff --git a/chrome/browser/ntp_tiles/chrome_most_visited_sites_factory.cc b/chrome/browser/ntp_tiles/chrome_most_visited_sites_factory.cc
--- a/chrome/browser/ntp_tiles/chrome_most_visited_sites_factory.cc
+++ b/chrome/browser/ntp_tiles/chrome_most_visited_sites_factory.cc
@@ -67,10 +67,6 @@ ChromeMostVisitedSitesFactory::NewForProfile(Profile* profile) {
std::unique_ptr<data_decoder::DataDecoder> data_decoder;
-#if BUILDFLAG(IS_ANDROID)
- data_decoder = std::make_unique<data_decoder::DataDecoder>();
-#endif
-
bool is_default_chrome_app_migrated;
#if BUILDFLAG(IS_ANDROID)
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/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -4182,6 +4182,12 @@ To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>delete the Chrome d
<message name="IDS_RECENT_TABS" desc="Text for button to show 'Recent tabs', i.e. recently closed tabs and tabs that are open on other devices [CHAR_LIMIT=20]">
Recent tabs
</message>
+ <message name="IDS_MOST_VISITED_PLACEHOLDER_TITLE" desc="Header text shown on the new tab page when there are no most visited tiles yet.">
+ Nothing to see here… yet
+ </message>
+ <message name="IDS_MOST_VISITED_PLACEHOLDER_SUMMARY" desc="Explanation text shown on the new tab page when there are no most visited tiles yet.">
+ Your most visited pages will appear here
+ </message>
<message name="IDS_MOST_VISITED_ITEM_REMOVED" desc="Snackbar text shown after invoking context menu item &quot;Remove&quot; of a Top Sites Tile in the Most Visited Tiles area in the New Tab Page.">
This site won&apos;t be shown again
</message>
diff --git a/components/history/core/browser/top_sites_constants.h b/components/history/core/browser/top_sites_constants.h
--- a/components/history/core/browser/top_sites_constants.h
+++ b/components/history/core/browser/top_sites_constants.h
@@ -9,7 +9,7 @@
namespace history {
// How many top sites to store in the cache.
-static constexpr size_t kTopSitesNumber = 10;
+static constexpr size_t kTopSitesNumber = 4 * 4 + 2;
} // namespace history
#endif // COMPONENTS_HISTORY_CORE_BROWSER_TOP_SITES_CONSTANTS_H_
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/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc
--- a/components/omnibox/common/omnibox_features.cc
+++ b/components/omnibox/common/omnibox_features.cc
@@ -194,6 +194,7 @@ BASE_FEATURE(kOmniboxAimDeferShowUntilVisualStateReady, ENABLED);
BASE_FEATURE(kDefaultTypedNavigationsToHttps,
"OmniboxDefaultTypedNavigationsToHttps",
enable_if(IS_IOS));
+SET_CROMITE_FEATURE_ENABLED(kDefaultTypedNavigationsToHttps);
// Override the delay to create a spare renderer when the omnibox is focused
// on Android.
@@ -278,6 +279,7 @@ BASE_FEATURE(kOmniboxMobileParityUpdate, ENABLED);
// Updates various NTP/Omnibox assets and descriptions for visual alignment on
// Android and iOS, V2.
BASE_FEATURE(kOmniboxMobileParityUpdateV2, ENABLED);
+SET_CROMITE_FEATURE_DISABLED(kOmniboxMobileParityUpdateV2);
// If enabled, the X-Geo header will include permission granularity.
BASE_FEATURE(kOmniboxXGeoPermissionGranularity, ENABLED);
diff --git a/components/search_engines/template_url.h b/components/search_engines/template_url.h
--- a/components/search_engines/template_url.h
+++ b/components/search_engines/template_url.h
@@ -803,9 +803,9 @@ class TemplateURL {
}
const GURL& favicon_url() const { return data().favicon_url; }
- const GURL& logo_url() const { return data().logo_url; }
+ const GURL logo_url() const { return GURL(); }
- const GURL& doodle_url() const { return data().doodle_url; }
+ const GURL doodle_url() const { return GURL(); }
const GURL& originating_url() const { return data().originating_url; }
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Restore-Simplified-NTP-launch.inc b/cromite_flags/chrome/browser/about_flags_cc/Restore-Simplified-NTP-launch.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/Restore-Simplified-NTP-launch.inc
@@ -0,0 +1,12 @@
+#if BUILDFLAG(IS_ANDROID)
+
+#ifdef FLAG_SECTION
+
+ {"simplified-ntp",
+ "Simplified NTP",
+ "Show a simplified New Tab Page.", kOsAndroid,
+ FEATURE_VALUE_TYPE(chrome::android::kSimplifiedNTP)},
+
+#endif
+
+#endif
diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Restore-Simplified-NTP-launch.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Restore-Simplified-NTP-launch.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Restore-Simplified-NTP-launch.inc
@@ -0,0 +1,6 @@
+CROMITE_FEATURE(kSimplifiedNTP,
+ "SimplifiedNTP",
+ base::FEATURE_ENABLED_BY_DEFAULT);
+
+SET_CROMITE_FEATURE_DISABLED(kNewTabPageCustomizationV2);
+SET_CROMITE_FEATURE_DISABLED(kNewTabPageCustomizationForMvt);
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);
--