diff --git a/build/patches/Add-option-to-force-tablet-UI.patch b/build/patches/Add-option-to-force-tablet-UI.patch
index bdc9fb94..ba960171 100644
--- a/build/patches/Add-option-to-force-tablet-UI.patch
+++ b/build/patches/Add-option-to-force-tablet-UI.patch
@@ -8,34 +8,36 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
.../java/res/layout/recent_tabs_page.xml | 2 +-
.../java/res/values-sw600dp/dimens.xml | 4 ++--
chrome/android/java/res/values/dimens.xml | 6 ++++-
+ .../browser/ChromeBaseAppCompatActivity.java | 3 +++
.../chrome/browser/WarmupManager.java | 5 +++-
.../settings/AccessibilitySettings.java | 13 ++++++++++
.../ChromeAccessibilitySettingsDelegate.java | 19 +++++++++++++++
.../chrome/browser/app/ChromeActivity.java | 4 +++-
.../overlays/strip/StripLayoutHelper.java | 10 ++++++--
- .../strip/StripLayoutHelperManager.java | 6 ++++-
+ .../strip/StripLayoutHelperManager.java | 5 +++-
+ .../init/ChromeBrowserInitializer.java | 2 ++
.../tabbed_mode/TabbedRootUiCoordinator.java | 4 +++-
.../chrome/browser/ui/RootUiCoordinator.java | 5 +++-
chrome/browser/preferences/BUILD.gn | 1 +
.../preferences/ChromePreferenceKeys.java | 1 +
- .../preferences/ChromeSharedPreferences.java | 8 +++++++
+ .../preferences/ChromeSharedPreferences.java | 12 ++++++++++
.../LegacyChromePreferenceKeys.java | 1 +
- .../SingleTabSwitcherOnNtpMediator.java | 1 +
+ .../AppHeaderCoordinator.java | 2 ++
.../omnibox/LocationBarCoordinator.java | 2 +-
.../strings/android_chrome_strings.grd | 7 ++++++
.../java/res/layout/control_container.xml | 10 ++++----
.../java/res/layout/toolbar_tablet.xml | 2 +-
.../java/res/values-sw600dp/dimens.xml | 5 ++--
- .../toolbar/java/res/values/dimens.xml | 5 ++--
+ .../toolbar/java/res/values/dimens.xml | 6 +++--
.../browser/toolbar/ControlContainer.java | 2 +-
.../toolbar/top/ToolbarControlContainer.java | 24 ++++++++++++++++++-
.../browser/toolbar/top/ToolbarLayout.java | 5 +++-
- .../TabStripTransitionCoordinator.java | 2 +-
- components/BUILD.gn | 6 ++---
+ .../tab_strip/HeightTransitionHandler.java | 2 ++
+ .../TabStripTransitionCoordinator.java | 6 ++++-
.../res/xml/accessibility_preferences.xml | 5 ++++
.../AccessibilitySettingsDelegate.java | 11 +++++++++
- .../chromium/ui/base/DeviceFormFactor.java | 9 +++++++
- 31 files changed, 157 insertions(+), 30 deletions(-)
+ .../chromium/ui/base/DeviceFormFactor.java | 14 +++++++++++
+ 33 files changed, 175 insertions(+), 27 deletions(-)
diff --git a/chrome/android/java/res/layout/custom_tabs_control_container.xml b/chrome/android/java/res/layout/custom_tabs_control_container.xml
--- a/chrome/android/java/res/layout/custom_tabs_control_container.xml
@@ -93,6 +95,26 @@ diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res
375dp
60dp
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java
+@@ -51,6 +51,7 @@ import org.chromium.chrome.browser.metrics.UmaSessionStats;
+ import org.chromium.chrome.browser.night_mode.GlobalNightModeStateProviderHolder;
+ import org.chromium.chrome.browser.night_mode.NightModeStateProvider;
+ import org.chromium.chrome.browser.night_mode.NightModeUtils;
++import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
+ import org.chromium.components.browser_ui.util.AutomotiveUtils;
+ import org.chromium.ui.display.DisplaySwitches;
+ import org.chromium.ui.display.DisplayUtil;
+@@ -123,6 +124,8 @@ public class ChromeBaseAppCompatActivity extends AppCompatActivity
+ protected void attachBaseContext(Context newBase) {
+ super.attachBaseContext(newBase);
+
++ ChromeSharedPreferences.warmUp();
++
+ // Make sure the "chrome" split is loaded before checking if ClassLoaders are equal.
+ SplitChromeApplication.finishPreload(CHROME_SPLIT_NAME);
+ ClassLoader chromeModuleClassLoader = ChromeBaseAppCompatActivity.class.getClassLoader();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java b/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
@@ -232,7 +254,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/over
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
-@@ -455,11 +455,15 @@ public class StripLayoutHelperManager
+@@ -455,7 +455,10 @@ public class StripLayoutHelperManager
mIsLayoutOptimizationsEnabled =
ToolbarFeatures.isTabStripWindowLayoutOptimizationEnabled(true);
@@ -244,11 +266,25 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/over
mHeight =
mIsLayoutOptimizationsEnabled
? toolbarManager.getTabStripHeightSupplier().get() / mDensity
- : mScrollableStripHeight;
-+
- mTopPadding = mHeight - mScrollableStripHeight;
- mDesktopWindowStateProvider = desktopWindowStateProvider;
- mStripVisibilityStateSupplier = new ObservableSupplierImpl<>(StripVisibilityState.UNKNOWN);
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
+@@ -17,6 +17,7 @@ import org.chromium.base.library_loader.LibraryProcessType;
+ import org.chromium.base.task.ChainedTasks;
+ import org.chromium.base.task.TaskTraits;
+ import org.chromium.chrome.browser.flags.ChromeSwitches;
++import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
+ import org.chromium.chrome.browser.profiles.ProfileManager;
+ import org.chromium.chrome.browser.signin.SigninCheckerProvider;
+ import org.chromium.components.background_task_scheduler.BackgroundTaskSchedulerFactory;
+@@ -107,6 +108,7 @@ public class ChromeBrowserInitializer {
+ public void handlePreNativeStartupAndLoadLibraries(final BrowserParts parts) {
+ ThreadUtils.checkUiThread();
+ if (parts.isActivityFinishingOrDestroyed()) return;
++ ChromeSharedPreferences.warmUp();
+ ProcessInitializationHandler.getInstance().initializePreNative();
+ ProcessInitializationHandler.getInstance().initializePreNativeLibraryLoad();
+ try (TraceEvent e = TraceEvent.scoped("ChromeBrowserInitializer.preInflationStartup")) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -319,7 +355,7 @@ diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/bro
@JNINamespace("android::shared_preferences")
public class ChromeSharedPreferences {
public static final PreferenceKeyRegistry REGISTRY =
-@@ -23,6 +25,12 @@ public class ChromeSharedPreferences {
+@@ -23,6 +25,16 @@ public class ChromeSharedPreferences {
LegacyChromePreferenceKeys.getPrefixesInUse())
: null);
@@ -328,6 +364,10 @@ diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/bro
+ ChromeSharedPreferences.getInstance().readBoolean(
+ ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, false));
+ }
++
++ public static void warmUp() {
++ // intentionally empty
++ }
+
/**
* @return The //base SharedPreferencesManager singleton.
@@ -343,17 +383,25 @@ diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/bro
ChromePreferenceKeys.FONT_USER_SET_FORCE_ENABLE_ZOOM,
ChromePreferenceKeys.HISTORY_SHOW_HISTORY_INFO,
ChromePreferenceKeys.HOMEPAGE_ENABLED,
-diff --git a/chrome/browser/single_tab/android/java/src/org/chromium/chrome/browser/single_tab/SingleTabSwitcherOnNtpMediator.java b/chrome/browser/single_tab/android/java/src/org/chromium/chrome/browser/single_tab/SingleTabSwitcherOnNtpMediator.java
---- a/chrome/browser/single_tab/android/java/src/org/chromium/chrome/browser/single_tab/SingleTabSwitcherOnNtpMediator.java
-+++ b/chrome/browser/single_tab/android/java/src/org/chromium/chrome/browser/single_tab/SingleTabSwitcherOnNtpMediator.java
-@@ -41,6 +41,7 @@ import org.chromium.components.browser_ui.widget.displaystyle.HorizontalDisplayS
- import org.chromium.components.browser_ui.widget.displaystyle.UiConfig;
- import org.chromium.components.browser_ui.widget.displaystyle.UiConfig.DisplayStyle;
- import org.chromium.components.embedder_support.util.UrlUtilities;
+diff --git a/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderCoordinator.java b/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderCoordinator.java
+--- a/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderCoordinator.java
++++ b/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderCoordinator.java
+@@ -30,6 +30,7 @@ import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
+ import org.chromium.chrome.browser.lifecycle.SaveInstanceStateObserver;
+ import org.chromium.chrome.browser.lifecycle.TopResumedActivityChangedObserver;
+ import org.chromium.chrome.browser.ui.desktop_windowing.AppHeaderUtils.DesktopWindowHeuristicResult;
+import org.chromium.ui.base.DeviceFormFactor;
- import org.chromium.ui.modelutil.PropertyModel;
- import org.chromium.url.GURL;
+ import org.chromium.ui.InsetObserver;
+ import org.chromium.ui.InsetsRectProvider;
+ import org.chromium.ui.util.ColorUtils;
+@@ -238,6 +239,7 @@ public class AppHeaderCoordinator
+ InsetObserver insetObserver,
+ InsetsRectProvider insetsRectProvider,
+ @DesktopWindowHeuristicResult int currentResult) {
++ if (DeviceFormFactor.isForceTabletUI()) return DesktopWindowHeuristicResult.IN_DESKTOP_WINDOW;
+ @DesktopWindowHeuristicResult int newResult;
+ assert insetObserver.getLastRawWindowInsets() != null
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java
@@ -459,7 +507,7 @@ diff --git a/chrome/browser/ui/android/toolbar/java/res/values-sw600dp/dimens.xm
diff --git a/chrome/browser/ui/android/toolbar/java/res/values/dimens.xml b/chrome/browser/ui/android/toolbar/java/res/values/dimens.xml
--- a/chrome/browser/ui/android/toolbar/java/res/values/dimens.xml
+++ b/chrome/browser/ui/android/toolbar/java/res/values/dimens.xml
-@@ -10,8 +10,9 @@ found in the LICENSE file.
+@@ -10,8 +10,10 @@ found in the LICENSE file.
10dp
@@ -468,6 +516,7 @@ diff --git a/chrome/browser/ui/android/toolbar/java/res/values/dimens.xml b/chro
+ 0dp
+ 40dp
+ 0dp
++ 2dp
64dp
@@ -547,48 +596,48 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow
}
/** Triggered when the content view for the specified tab has changed. */
+diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/HeightTransitionHandler.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/HeightTransitionHandler.java
+--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/HeightTransitionHandler.java
++++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/HeightTransitionHandler.java
+@@ -27,6 +27,7 @@ import org.chromium.chrome.browser.toolbar.top.ToolbarLayout;
+ import org.chromium.chrome.browser.toolbar.top.tab_strip.TabStripTransitionCoordinator.TabStripHeightObserver;
+ import org.chromium.chrome.browser.toolbar.top.tab_strip.TabStripTransitionCoordinator.TabStripTransitionDelegate;
+ import org.chromium.ui.base.ViewUtils;
++import org.chromium.ui.base.DeviceFormFactor;
+ import org.chromium.ui.resources.dynamics.DynamicResourceReadyOnceCallback;
+
+ /**
+@@ -450,6 +451,7 @@ class HeightTransitionHandler {
+ if (TabStripTransitionCoordinator.sHeightTransitionThresholdForTesting != null) {
+ return TabStripTransitionCoordinator.sHeightTransitionThresholdForTesting;
+ }
++ if (DeviceFormFactor.isForceTabletUI()) return 0;
+ return TRANSITION_THRESHOLD_DP;
+ }
+ }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinator.java
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinator.java
-@@ -151,7 +151,7 @@ public class TabStripTransitionCoordinator implements ComponentCallbacks, AppHea
+@@ -27,6 +27,7 @@ import org.chromium.chrome.browser.ui.desktop_windowing.AppHeaderState;
+ import org.chromium.chrome.browser.ui.desktop_windowing.AppHeaderUtils;
+ import org.chromium.chrome.browser.ui.desktop_windowing.DesktopWindowStateProvider;
+ import org.chromium.chrome.browser.ui.desktop_windowing.DesktopWindowStateProvider.AppHeaderObserver;
++import org.chromium.ui.base.DeviceFormFactor;
+ import org.chromium.ui.util.TokenHolder;
+
+ /** Class used to manage tab strip visibility and height updates. */
+@@ -151,7 +152,10 @@ public class TabStripTransitionCoordinator implements ComponentCallbacks, AppHea
mTabStripReservedTopPadding =
controlContainerView()
.getResources()
- .getDimensionPixelSize(R.dimen.tab_strip_reserved_top_padding);
-+ .getDimensionPixelSize(R.dimen.tab_strip_reserved_top_padding_cromite);
++ .getDimensionPixelSize(
++ DeviceFormFactor.isForceTabletUI()
++ ? R.dimen.tab_strip_reserved_top_padding_tabletui
++ : R.dimen.tab_strip_reserved_top_padding_cromite);
mOnLayoutChangedListener =
(view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
-diff --git a/components/BUILD.gn b/components/BUILD.gn
---- a/components/BUILD.gn
-+++ b/components/BUILD.gn
-@@ -71,7 +71,7 @@ if (is_ios) {
-
- # Omit Lacros because it allows //components to depend on //chrome, which in
- # turn depends on //extensions.
--if (!is_chromeos_lacros) {
-+if (!is_chromeos_lacros && !is_android) {
- disallowed_extension_deps_ = [
- # Components should largely not depend on //extensions. Since // extensions
- # is not a component target and is linked with //chrome, depending on most
-@@ -877,7 +877,7 @@ test("components_unittests") {
- # On other platforms, no components should depend on Chrome.
- # Since //chrome depends on //extensions, we also only assert_no_deps on
- # extensions targets for non-lacros builds.
-- if (!is_chromeos_lacros) {
-+ if (!is_chromeos_lacros && !is_android) {
- assert_no_deps = [ "//chrome/*" ]
- assert_no_deps += disallowed_extension_deps_
- }
-@@ -1170,7 +1170,7 @@ if (use_blink) {
- # dependency. On other platforms, no components should depend on Chrome.
- # Since //chrome depends on //extensions, we also only assert_no_deps on
- # extensions targets for non-lacros builds.
-- if (!is_chromeos_lacros) {
-+ if (!is_chromeos_lacros && !is_android) {
- assert_no_deps = [ "//chrome/*" ]
- assert_no_deps += disallowed_extension_deps_
- }
diff --git a/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml b/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml
--- a/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml
+++ b/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml
@@ -639,7 +688,7 @@ diff --git a/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java b/ui
/** See {@link #setIsTabletForTesting(boolean)}. */
private static Boolean sIsTabletForTesting;
-+ private static boolean mForceTabletUI = true;
++ private static boolean mForceTabletUI = false;
+ public static void setForceTabletUI(boolean forceTabletUI) {
+ mForceTabletUI = forceTabletUI;
+ }
@@ -650,7 +699,15 @@ diff --git a/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java b/ui
/**
* Each activity could be on a different display, and this will just tell you whether the
* display associated with the application context is "tablet sized". Use {@link
-@@ -73,6 +81,7 @@ public class DeviceFormFactor {
+@@ -43,6 +51,7 @@ public class DeviceFormFactor {
+ @CalledByNative
+ @Deprecated
+ public static boolean isTablet() {
++ if (mForceTabletUI) return true;
+ if (sIsTabletForTesting != null) {
+ return sIsTabletForTesting;
+ }
+@@ -73,6 +82,7 @@ public class DeviceFormFactor {
* E.g. http://developer.samsung.com/samsung-dex/testing
*/
public static boolean isNonMultiDisplayContextOnTablet(Context context) {
@@ -658,4 +715,36 @@ diff --git a/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java b/ui
return detectScreenWidthBucket(context) >= SCREEN_BUCKET_TABLET;
}
+@@ -108,6 +118,7 @@ public class DeviceFormFactor {
+ * @return The screen width bucket the device is in (see constants at the top of this class).
+ */
+ private static int detectScreenWidthBucket(Context context) {
++ if (mForceTabletUI) return SCREEN_BUCKET_TABLET;
+ return context.getResources().getInteger(R.integer.min_screen_width_bucket);
+ }
+
+@@ -115,6 +126,7 @@ public class DeviceFormFactor {
+ ThreadUtils.assertOnUiThread();
+ Context context = windowAndroid.getContext().get();
+ if (context == null) return 0;
++ if (mForceTabletUI) return SCREEN_BUCKET_TABLET;
+ return context.getResources().getInteger(R.integer.min_screen_width_bucket);
+ }
+
+@@ -124,6 +136,7 @@ public class DeviceFormFactor {
+ */
+ @UiThread
+ public static int getNonMultiDisplayMinimumTabletWidthPx(Context context) {
++ if (mForceTabletUI) return 0;
+ return getMinimumTabletWidthPx(DisplayAndroid.getNonMultiDisplay(context));
+ }
+
+@@ -132,6 +145,7 @@ public class DeviceFormFactor {
+ * layout.
+ */
+ public static int getMinimumTabletWidthPx(DisplayAndroid display) {
++ if (mForceTabletUI) return 0;
+ return DisplayUtil.dpToPx(display, DeviceFormFactor.MINIMUM_TABLET_WIDTH_DP);
+ }
+ }
--