From: uazo Date: Sun, 5 May 2024 09:34:39 +0000 Subject: Add option to force tablet UI License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html --- .../layout/custom_tabs_control_container.xml | 2 +- .../java/res/layout/recent_tabs_page.xml | 2 +- .../java/res/values-sw600dp/dimens.xml | 3 ++- chrome/android/java/res/values/dimens.xml | 3 ++- .../browser/ChromeBaseAppCompatActivity.java | 3 +++ .../chrome/browser/WarmupManager.java | 7 +++++-- .../ChromeAccessibilitySettingsDelegate.java | 19 +++++++++++++++++++ .../chrome/browser/app/ChromeActivity.java | 5 ++++- .../overlays/strip/StripLayoutHelper.java | 1 + .../strip/StripLayoutHelperManager.java | 6 +++++- .../scene_layer/TabStripSceneLayer.java | 8 ++++++++ .../init/ChromeBrowserInitializer.java | 2 ++ .../tabbed_mode/TabbedRootUiCoordinator.java | 4 +++- .../chrome/browser/ui/RootUiCoordinator.java | 6 +++++- chrome/browser/preferences/BUILD.gn | 1 + .../preferences/ChromePreferenceKeys.java | 1 + .../preferences/ChromeSharedPreferences.java | 12 ++++++++++++ .../LegacyChromePreferenceKeys.java | 1 + .../ui/desktop_windowing/AppHeaderUtils.java | 2 ++ .../omnibox/LocationBarCoordinator.java | 2 +- .../strings/android_chrome_strings.grd | 7 +++++++ .../java/res/layout/control_container.xml | 8 ++++---- .../java/res/layout/toolbar_tablet.xml | 2 +- .../java/res/values-sw600dp/dimens.xml | 5 +++-- .../toolbar/java/res/values/dimens.xml | 6 ++++-- .../toolbar/top/ToolbarControlContainer.java | 6 ++++++ .../browser/toolbar/top/ToolbarLayout.java | 5 ++++- .../tab_strip/HeightTransitionHandler.java | 2 ++ .../TabStripTransitionCoordinator.java | 6 +++++- .../res/xml/accessibility_preferences.xml | 5 +++++ .../accessibility/AccessibilitySettings.java | 13 +++++++++++++ .../AccessibilitySettingsDelegate.java | 2 ++ .../chromium/ui/base/DeviceFormFactor.java | 14 ++++++++++++++ 33 files changed, 149 insertions(+), 22 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 +++ b/chrome/android/java/res/layout/custom_tabs_control_container.xml @@ -31,7 +31,7 @@ found in the LICENSE file. android:id="@+id/find_toolbar_stub" android:inflatedId="@+id/find_toolbar" android:visibility="gone" - android:layout_marginTop="@dimen/tab_strip_height" + android:layout_marginTop="@dimen/tab_strip_height_cromite" android:layout_width="match_parent" android:layout_height="@dimen/custom_tabs_control_container_height" android:layout="@layout/find_toolbar" /> diff --git a/chrome/android/java/res/layout/recent_tabs_page.xml b/chrome/android/java/res/layout/recent_tabs_page.xml --- a/chrome/android/java/res/layout/recent_tabs_page.xml +++ b/chrome/android/java/res/layout/recent_tabs_page.xml @@ -11,7 +11,7 @@ found in the LICENSE file. android:id="@+id/history_navigation" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingTop="@dimen/tab_strip_height" > + android:paddingTop="@dimen/tab_strip_height_cromite" > 14sp - 96dp + 96dp + 56dp 60dp 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 @@ -116,7 +116,8 @@ found in the LICENSE file. 50dp - @dimen/default_action_bar_height + @dimen/default_action_bar_height + 56dp @dimen/default_action_bar_height 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 @@ -65,6 +65,7 @@ import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeController; import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeControllerCreator; import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeFieldTrialImpl; import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeUtils; +import org.chromium.chrome.browser.preferences.ChromeSharedPreferences; import org.chromium.chrome.browser.ui.edge_to_edge.SimpleEdgeToEdgeController; import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.components.browser_ui.util.AutomotiveUtils; @@ -154,6 +155,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 @@ -64,6 +64,7 @@ import org.chromium.chrome.browser.toolbar.ControlContainer; import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.LayoutInflaterUtils; +import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.display.DisplayUtil; import org.chromium.url.GURL; @@ -475,8 +476,10 @@ public class WarmupManager { ControlContainer controlContainer = mainView.findViewById(R.id.control_container); if (toolbarId != ActivityUtils.NO_RESOURCE_ID && controlContainer != null) { - controlContainer.initWithToolbar( - toolbarId, R.dimen.custom_tabs_control_container_height); + controlContainer.initWithToolbar(toolbarId, + DeviceFormFactor.isForceTabletUI() + ? R.dimen.control_container_height_tabletui + : R.dimen.custom_tabs_control_container_height); } return mainView; } catch (InflateException e) { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java --- a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java @@ -67,6 +67,25 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting } } + private static class ForceTabletUIDelegate implements BooleanPreferenceDelegate { + @Override + public boolean getValue() { + return ChromeSharedPreferences.getInstance().readBoolean( + ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, false); + } + + @Override + public void setValue(boolean value) { + ChromeSharedPreferences.getInstance().writeBoolean( + ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, value); + } + } + + @Override + public BooleanPreferenceDelegate getForceTabletUIDelegate() { + return new ForceTabletUIDelegate(); + } + private final Profile mProfile; /** diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java --- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java @@ -850,7 +850,10 @@ public abstract class ChromeActivity extends AsyncInitializationActivity // Inflate the correct toolbar layout for the device. int toolbarLayoutId = getToolbarLayoutId(); if (toolbarLayoutId != ActivityUtils.NO_RESOURCE_ID && controlContainer != null) { - controlContainer.initWithToolbar(toolbarLayoutId, getToolbarLayoutHeightResId()); + controlContainer.initWithToolbar(toolbarLayoutId, + DeviceFormFactor.isForceTabletUI() + ? R.dimen.control_container_height_tabletui + : getToolbarLayoutHeightResId()); } onInitialLayoutInflationComplete(); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java @@ -138,6 +138,7 @@ import org.chromium.components.tab_group_sync.TabGroupSyncService; import org.chromium.components.tab_group_sync.TriggerSource; import org.chromium.components.tab_groups.TabGroupColorId; import org.chromium.ui.accessibility.AccessibilityState; +import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.util.ColorUtils; 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 @@ -118,6 +118,7 @@ import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateMa import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.components.browser_ui.widget.gesture.BackPressHandler; import org.chromium.content_public.browser.LoadUrlParams; +import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.base.PageTransition; import org.chromium.ui.base.WindowAndroid; @@ -584,7 +585,10 @@ public class StripLayoutHelperManager mIsHeaderCustomizationSupported = ToolbarFeatures.isAppHeaderCustomizationSupported( /* isTablet= */ true, DisplayUtil.isContextInDefaultDisplay(mContext)); - mScrollableStripHeight = res.getDimension(R.dimen.tab_strip_height) / mDensity; + mScrollableStripHeight = + (DeviceFormFactor.isForceTabletUI() + ? res.getDimension(R.dimen.tab_strip_height_tabletui) + : res.getDimension(R.dimen.tab_strip_height_cromite)) / mDensity; mHeight = mIsHeaderCustomizationSupported ? toolbarManager.getTabStripHeightSupplier().get() / mDensity diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java @@ -124,6 +124,14 @@ public class TabStripSceneLayer extends SceneOverlayLayer { if (mNativePtr == 0) return; final boolean visible = yOffset > -layoutHelper.getHeight(); + if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(ContextUtils.getApplicationContext())) { + TintedCompositorButton newTabButton = layoutHelper.getNewTabButton(); + if (newTabButton.isVisible()) { + rightPaddingDp += newTabButton.getWidth() + layoutHelper.getNewTabBtnVisualOffset() + + StripLayoutGroupTitle.REORDER_BACKGROUND_PADDING_END; + } + } + // This will hide the tab strips if necessary. TabStripSceneLayerJni.get() .beginBuildingFrame(mNativePtr, visible, resourceManager, layerTitleCache); 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 @@ -18,6 +18,7 @@ import org.chromium.base.task.TaskTraits; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; 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; @@ -110,6 +111,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 @@ -934,7 +934,9 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator { @Override public int getControlContainerHeightResource() { - return R.dimen.control_container_height; + if (DeviceFormFactor.isForceTabletUI()) + return R.dimen.control_container_height_tabletui; + return R.dimen.control_container_height_cromite; } @Override diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java @@ -135,6 +135,8 @@ import org.chromium.chrome.browser.paint_preview.DemoPaintPreview; import org.chromium.chrome.browser.password_manager.ManagePasswordsReferrer; import org.chromium.chrome.browser.password_manager.PasswordManagerLauncher; import org.chromium.chrome.browser.pdf.PdfPage; +import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; +import org.chromium.chrome.browser.preferences.ChromeSharedPreferences; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.quick_delete.QuickDeleteController; import org.chromium.chrome.browser.quick_delete.QuickDeleteDelegateImpl; @@ -2096,7 +2098,9 @@ public class RootUiCoordinator protected int getFindToolbarStub() { int stubId = R.id.find_toolbar_stub; - if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(mActivity)) { + if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(mActivity) && + !ChromeSharedPreferences.getInstance().readBoolean( + ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, false)) { stubId = R.id.find_toolbar_tablet_stub; } return stubId; diff --git a/chrome/browser/preferences/BUILD.gn b/chrome/browser/preferences/BUILD.gn --- a/chrome/browser/preferences/BUILD.gn +++ b/chrome/browser/preferences/BUILD.gn @@ -27,6 +27,7 @@ android_library("java") { "//components/cached_flags:java", "//third_party/androidx:androidx_annotation_annotation_java", "//third_party/jni_zero:jni_zero_java", + "//ui/android:ui_java", ] srcjar_deps = [ diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java --- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java +++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java @@ -413,6 +413,7 @@ public final class ChromePreferenceKeys { /** Whether the app-specific history info text was already seen by users. */ public static final String HISTORY_APP_SPECIFIC_INFO_SEEN = "Chrome.History.AppSpecificInfoSeen"; + public static final String FLAGS_FORCE_TABLET_UI_ENABLED = "force_tablet_ui_enabled"; /** Keys used to save settings related to homepage. */ public static final String DEPRECATED_HOMEPAGE_CUSTOM_URI = "homepage_custom_uri"; diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromeSharedPreferences.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromeSharedPreferences.java --- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromeSharedPreferences.java +++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromeSharedPreferences.java @@ -14,6 +14,8 @@ import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; import org.chromium.build.annotations.OptimizeAsNonNull; +import org.chromium.ui.base.DeviceFormFactor; + @JNINamespace("android::shared_preferences") @NullMarked public class ChromeSharedPreferences { @@ -26,6 +28,16 @@ public class ChromeSharedPreferences { LegacyChromePreferenceKeys.getPrefixesInUse()) : null); + static { + DeviceFormFactor.setForceTabletUI( + ChromeSharedPreferences.getInstance().readBoolean( + ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, false)); + } + + public static void warmUp() { + // intentionally empty + } + /** * @return The //base SharedPreferencesManager singleton. */ diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java --- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java +++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java @@ -56,6 +56,7 @@ public class LegacyChromePreferenceKeys { ChromePreferenceKeys.FIRST_RUN_FLOW_COMPLETE, ChromePreferenceKeys.FIRST_RUN_FLOW_SIGNIN_SETUP, ChromePreferenceKeys.FIRST_RUN_LIGHTWEIGHT_FLOW_COMPLETE, + ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, ChromePreferenceKeys.FIRST_RUN_SKIP_WELCOME_PAGE, ChromePreferenceKeys.HISTORY_SHOW_HISTORY_INFO, ChromePreferenceKeys.HOMEPAGE_ENABLED, diff --git a/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderUtils.java b/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderUtils.java --- a/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderUtils.java +++ b/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderUtils.java @@ -20,6 +20,7 @@ import org.chromium.build.annotations.Nullable; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher.ActivityState; import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateManager; +import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.display.DisplayUtil; import org.chromium.ui.insets.InsetsRectProvider; @@ -169,6 +170,7 @@ public class AppHeaderUtils { */ static @DesktopWindowHeuristicResult int checkIsInDesktopWindow( InsetsRectProvider insetsRectProvider, Context context) { + if (DeviceFormFactor.isForceTabletUI()) return DesktopWindowHeuristicResult.IN_DESKTOP_WINDOW; @DesktopWindowHeuristicResult int newResult; boolean isOnExternalDisplay = !DisplayUtil.isContextInDefaultDisplay(context); 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 @@ -1050,7 +1050,7 @@ public class LocationBarCoordinator } private boolean isTabletWindow() { - return DeviceFormFactor.isWindowOnTablet(mWindowAndroid); + return DeviceFormFactor.isWindowOnTablet(mWindowAndroid) || isTabletLayout(); } /* package */ LocationBarMediator getMediatorForTesting() { 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 @@ -1635,6 +1635,13 @@ Your Google account may have other forms of browsing history like searches and a Privacy guide explanation closed + + Open chromium in Tablet Mode + + + Force Tablet Mode + + Safety check diff --git a/chrome/browser/ui/android/toolbar/java/res/layout/control_container.xml b/chrome/browser/ui/android/toolbar/java/res/layout/control_container.xml --- a/chrome/browser/ui/android/toolbar/java/res/layout/control_container.xml +++ b/chrome/browser/ui/android/toolbar/java/res/layout/control_container.xml @@ -9,7 +9,7 @@ found in the LICENSE file. android:id="@+id/control_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:minHeight="@dimen/control_container_height"> + android:minHeight="@dimen/control_container_height_cromite"> @@ -30,13 +30,13 @@ found in the LICENSE file. android:layout_height="wrap_content" android:layout_gravity="bottom" app:layout_anchorGravity="bottom" - /> + android:layout_marginTop="@dimen/control_container_height_cromite" /> diff --git a/chrome/browser/ui/android/toolbar/java/res/layout/toolbar_tablet.xml b/chrome/browser/ui/android/toolbar/java/res/layout/toolbar_tablet.xml --- a/chrome/browser/ui/android/toolbar/java/res/layout/toolbar_tablet.xml +++ b/chrome/browser/ui/android/toolbar/java/res/layout/toolbar_tablet.xml @@ -14,7 +14,7 @@ found in the LICENSE file. android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="@dimen/toolbar_height_no_shadow" - android:layout_marginTop="@dimen/tab_strip_height" + android:layout_marginTop="@dimen/tab_strip_height_tabletui" android:background="@macro/default_bg_color" > diff --git a/chrome/browser/ui/android/toolbar/java/res/values-sw600dp/dimens.xml b/chrome/browser/ui/android/toolbar/java/res/values-sw600dp/dimens.xml --- a/chrome/browser/ui/android/toolbar/java/res/values-sw600dp/dimens.xml +++ b/chrome/browser/ui/android/toolbar/java/res/values-sw600dp/dimens.xml @@ -7,6 +7,7 @@ found in the LICENSE file. - 40dp - 2dp + 40dp + 40dp + 2dp 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,10 @@ found in the LICENSE file. 9dp - 0dp - 0dp + 0dp + 40dp + 0dp + 2dp 64dp 72dp diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java @@ -7,6 +7,7 @@ package org.chromium.chrome.browser.toolbar.top; import static org.chromium.build.NullUtil.assumeNonNull; import android.content.Context; +import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.PorterDuff; @@ -176,6 +177,11 @@ public class ToolbarControlContainer extends OptimizedFrameLayout @Initializer public void initWithToolbar(int toolbarLayoutId, int toolbarLayoutHeightResId) { try (TraceEvent te = TraceEvent.scoped("ToolbarControlContainer.initWithToolbar")) { + if (DeviceFormFactor.isForceTabletUI() && toolbarLayoutHeightResId != 0) { + toolbarLayoutHeightResId = R.dimen.control_container_height_tabletui; + Resources res = getContext().getResources(); + setMinimumHeight((int) res.getDimension(toolbarLayoutHeightResId)); + } mToolbarContainer = findViewById(R.id.toolbar_container); mToolbarLayoutHeight = getResources().getDimensionPixelSize(toolbarLayoutHeightResId); ViewStub toolbarStub = findViewById(R.id.toolbar_stub); diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java @@ -67,6 +67,7 @@ import org.chromium.chrome.browser.util.BrowserUiUtils.ModuleTypeOnStartAndNtp; import org.chromium.components.feature_engagement.Tracker; import org.chromium.ui.base.ViewUtils; import org.chromium.ui.util.MotionEventUtils; +import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.util.TokenHolder; import org.chromium.url.GURL; @@ -599,7 +600,9 @@ public abstract class ToolbarLayout extends FrameLayout * @see Toolbar#getTabStripHeight() */ public int getTabStripHeightFromResource() { - return getResources().getDimensionPixelSize(R.dimen.tab_strip_height); + if (DeviceFormFactor.isForceTabletUI()) + return getResources().getDimensionPixelSize(R.dimen.tab_strip_height_tabletui); + return getResources().getDimensionPixelSize(R.dimen.tab_strip_height_cromite); } /** 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 @@ -29,6 +29,7 @@ import org.chromium.chrome.browser.toolbar.ControlContainer; import org.chromium.chrome.browser.toolbar.top.tab_strip.TabStripTransitionCoordinator.TabStripTransitionDelegate; import org.chromium.chrome.browser.toolbar.top.tab_strip.TabStripTransitionCoordinator.TabStripTransitionHandler; import org.chromium.ui.base.ViewUtils; +import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.resources.dynamics.DynamicResourceReadyOnceCallback; import org.chromium.ui.util.TokenHolder; @@ -514,6 +515,7 @@ class HeightTransitionHandler { /** Get the min screen width (in dp) required for the tab strip to become visible. */ private static int getScreenWidthThresholdDp() { + if (DeviceFormFactor.isForceTabletUI()) return 0; if (TabStripTransitionCoordinator.sHeightTransitionThresholdForTesting != null) { return TabStripTransitionCoordinator.sHeightTransitionThresholdForTesting; } 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 @@ -25,6 +25,7 @@ import org.chromium.chrome.browser.ui.desktop_windowing.AppHeaderUtils; import org.chromium.components.browser_ui.desktop_windowing.AppHeaderState; import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateManager; import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateManager.AppHeaderObserver; +import org.chromium.ui.base.DeviceFormFactor; /** * Class used to manage tab strip visibility and height updates. @@ -171,7 +172,10 @@ public class TabStripTransitionCoordinator implements ComponentCallbacks, AppHea mTabStripReservedTopPadding = controlContainerView() .getResources() - .getDimensionPixelSize(R.dimen.tab_strip_reserved_top_padding); + .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/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 @@ -46,6 +46,11 @@ found in the LICENSE file. android:summary="@string/caret_browsing_summary" android:title="@string/caret_browsing_title" /> + + diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java --- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java +++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java @@ -39,6 +39,7 @@ import org.chromium.content_public.browser.ContentFeatureMap; import org.chromium.ui.base.UiAndroidFeatureList; import org.chromium.chrome.browser.settings.ChromeBaseSettingsFragment; +import org.chromium.components.browser_ui.accessibility.AccessibilitySettingsDelegate.BooleanPreferenceDelegate; /** Fragment to keep track of all the accessibility related preferences. */ @NullMarked @@ -80,6 +81,9 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment } }; + private BooleanPreferenceDelegate mForceTabletUIDelegate; + static final String PREF_FORCE_TABLET_UI = "force_tablet_ui"; + private PageZoomPreference mPageZoomDefaultZoomPref; private ChromeSwitchPreference mPageZoomIncludeOSAdjustment; private ChromeSwitchPreference mPageZoomAlwaysShowPref; @@ -167,6 +171,12 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment readerEnableLinks.setOnPreferenceChangeListener(this); } + ChromeSwitchPreference forceTabletUiPref = + (ChromeSwitchPreference) findPreference(PREF_FORCE_TABLET_UI); + mForceTabletUIDelegate = mDelegate.getForceTabletUIDelegate(); + forceTabletUiPref.setChecked(mForceTabletUIDelegate.getValue()); + forceTabletUiPref.setOnPreferenceChangeListener(this); + Preference captions = findPreference(PREF_CAPTIONS); captions.setOnPreferenceClickListener( preference -> { @@ -262,6 +272,9 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment public boolean onPreferenceChange(Preference preference, Object newValue) { if (PREF_FORCE_ENABLE_ZOOM.equals(preference.getKey())) { mDelegate.getForceEnableZoomAccessibilityDelegate().setValue((Boolean) newValue); + } else if (PREF_FORCE_TABLET_UI.equals(preference.getKey())) { + mForceTabletUIDelegate.setValue((Boolean) newValue); + mDelegate.requestRestart(getActivity()); } else if (PREF_READER_FOR_ACCESSIBILITY.equals(preference.getKey())) { boolean readerModeEnabled = (Boolean) newValue; mDelegate.getReaderAccessibilityDelegate().setValue(readerModeEnabled); diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java --- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java +++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java @@ -42,6 +42,8 @@ public interface AccessibilitySettingsDelegate { */ BrowserContextHandle getBrowserContextHandle(); + BooleanPreferenceDelegate getForceTabletUIDelegate(); + /** * @return boolean value specifying if the Image Descriptions user setting should be shown. */ diff --git a/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java b/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java --- a/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java +++ b/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java @@ -87,6 +87,14 @@ public class DeviceFormFactor { /** See {@link #setIsTabletForTesting(boolean)}. */ private static @Nullable Boolean sIsTabletForTesting; + private static boolean mForceTabletUI = false; + public static void setForceTabletUI(boolean forceTabletUI) { + mForceTabletUI = forceTabletUI; + } + public static boolean isForceTabletUI() { + return mForceTabletUI; + } + /** * 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 @@ -95,6 +103,7 @@ public class DeviceFormFactor { @CalledByNative @Deprecated public static boolean isTablet() { + if (mForceTabletUI) return true; if (sIsTabletForTesting != null) { return sIsTabletForTesting; } @@ -125,6 +134,7 @@ public class DeviceFormFactor { * E.g. http://developer.samsung.com/samsung-dex/testing */ public static boolean isNonMultiDisplayContextOnTablet(Context context) { + if (mForceTabletUI) return true; return detectScreenWidthBucket(context) >= SCREEN_BUCKET_TABLET; } @@ -159,6 +169,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); } @@ -166,6 +177,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); } @@ -175,6 +187,7 @@ public class DeviceFormFactor { */ @UiThread public static int getNonMultiDisplayMinimumTabletWidthPx(Context context) { + if (mForceTabletUI) return 0; return getMinimumTabletWidthPx(DisplayAndroid.getNonMultiDisplay(context)); } @@ -183,6 +196,7 @@ public class DeviceFormFactor { * layout. */ public static int getMinimumTabletWidthPx(DisplayAndroid display) { + if (mForceTabletUI) return 0; return DisplayUtil.dpToPx(display, DeviceFormFactor.MINIMUM_TABLET_WIDTH_DP); } } --