From: Wengling Chen Date: Mon, 1 Feb 2021 19:18:55 +0200 Subject: Add option to force tablet UI License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html --- .../ChromeAccessibilitySettingsDelegate.java | 19 +++++++++++++++++++ .../browser/tasks/ReturnToChromeUtil.java | 4 +++- .../chrome/browser/ui/RootUiCoordinator.java | 5 ++++- chrome/browser/preferences/BUILD.gn | 1 + .../preferences/ChromePreferenceKeys.java | 1 + .../preferences/ChromeSharedPreferences.java | 8 ++++++++ .../LegacyChromePreferenceKeys.java | 1 + .../omnibox/LocationBarCoordinator.java | 2 +- .../strings/android_chrome_strings.grd | 7 +++++++ components/BUILD.gn | 6 +++--- .../res/xml/accessibility_preferences.xml | 5 +++++ .../accessibility/AccessibilitySettings.java | 10 ++++++++++ .../AccessibilitySettingsDelegate.java | 2 ++ .../chromium/ui/base/DeviceFormFactor.java | 6 ++++++ 14 files changed, 71 insertions(+), 6 deletions(-) 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 @@ -94,6 +94,25 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting return new TextSizeContrastAccessibilityDelegate(getBrowserContextHandle()); } + private static class ForceTabletUIDelegate implements BooleanPreferenceDelegate { + @Override + public boolean isEnabled() { + return ChromeSharedPreferences.getInstance().readBoolean( + ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, false); + } + + @Override + public void setEnabled(boolean value) { + ChromeSharedPreferences.getInstance().writeBoolean( + ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, value); + } + } + + @Override + public BooleanPreferenceDelegate getForceTabletUIDelegate() { + return new ForceTabletUIDelegate(); + } + @Override public void addExtraPreferences(PreferenceFragmentCompat fragment) { if (ImageDescriptionsController.getInstance().shouldShowImageDescriptionsMenuItem()) { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java --- a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java @@ -979,7 +979,9 @@ public final class ReturnToChromeUtil { public static boolean isScrollableMvtEnabled(Context context) { boolean isSurfacePolishEnabled = ChromeFeatureList.sSurfacePolish.isEnabled(); - if (!DeviceFormFactor.isNonMultiDisplayContextOnTablet(context)) { + if (!DeviceFormFactor.isNonMultiDisplayContextOnTablet(context) || + ChromeSharedPreferences.getInstance().readBoolean( + ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, false)) { // On phones, parameter SURFACE_POLISH_SCROLLABLE_MVT is checked when feature flag // surface polish is enabled; otherwise, feature flag // SHOW_SCROLLABLE_MVT_ON_NTP_PHONE_ANDROID is checked. 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 @@ -98,6 +98,7 @@ 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.preferences.ChromeSharedPreferences; +import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.price_tracking.PriceTrackingButtonController; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.ProfileManager; @@ -1595,7 +1596,9 @@ public class RootUiCoordinator if (!mSupportsFindInPageSupplier.getAsBoolean()) return; 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; } mFindToolbarManager = 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 @@ -26,6 +26,7 @@ android_library("java") { "//components/browser_ui/site_settings/android:constants_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 @@ -270,6 +270,7 @@ public final class ChromePreferenceKeys { AccessibilityConstants.FONT_USER_SET_FORCE_ENABLE_ZOOM; public static final String HISTORY_SHOW_HISTORY_INFO = "history_home_show_info"; + 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 @@ -11,6 +11,8 @@ import org.chromium.base.shared_preferences.PreferenceKeyRegistry; import org.chromium.base.shared_preferences.SharedPreferencesManager; import org.chromium.build.BuildConfig; +import org.chromium.ui.base.DeviceFormFactor; + @JNINamespace("android::shared_preferences") public class ChromeSharedPreferences { public static final PreferenceKeyRegistry REGISTRY = @@ -22,6 +24,12 @@ public class ChromeSharedPreferences { LegacyChromePreferenceKeys.getPrefixesInUse()) : null); + static { + DeviceFormFactor.setForceTabletUI( + ChromeSharedPreferences.getInstance().readBoolean( + ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, false)); + } + /** * @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 @@ -58,6 +58,7 @@ public class LegacyChromePreferenceKeys { ChromePreferenceKeys.FIRST_RUN_LIGHTWEIGHT_FLOW_COMPLETE, ChromePreferenceKeys.FIRST_RUN_SKIP_WELCOME_PAGE, ChromePreferenceKeys.FONT_USER_FONT_SCALE_FACTOR, + ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, ChromePreferenceKeys.FONT_USER_SET_FORCE_ENABLE_ZOOM, ChromePreferenceKeys.HISTORY_SHOW_HISTORY_INFO, ChromePreferenceKeys.HOMEPAGE_ENABLED, 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 @@ -771,7 +771,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 @@ -1564,6 +1564,13 @@ Your Google account may have other forms of browsing history like searches and a Manage third-party cookies and tracking protections + + Open chromium in Tablet Mode + + + Force Tablet Mode + + Safety check diff --git a/components/BUILD.gn b/components/BUILD.gn --- a/components/BUILD.gn +++ b/components/BUILD.gn @@ -69,7 +69,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 @@ -831,7 +831,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_ } @@ -1113,7 +1113,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 @@ -40,6 +40,11 @@ found in the LICENSE file. android:summary="@string/reader_for_accessibility_summary" android:title="@string/reader_for_accessibility_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 @@ -32,6 +32,8 @@ public class AccessibilitySettings extends PreferenceFragmentCompat public static final String PREF_CAPTIONS = "captions"; public static final String PREF_ZOOM_INFO = "zoom_info"; + private BooleanPreferenceDelegate mForceTabletUIDelegate; + static final String PREF_FORCE_TABLET_UI = "force_tablet_ui"; private TextScalePreference mTextScalePref; private PageZoomPreference mPageZoomDefaultZoomPref; private ChromeSwitchPreference mPageZoomIncludeOSAdjustment; @@ -129,6 +131,12 @@ public class AccessibilitySettings extends PreferenceFragmentCompat getPreferenceScreen().removePreference(readerForAccessibilityPref); } + ChromeSwitchPreference forceTabletUiPref = + (ChromeSwitchPreference) findPreference(PREF_FORCE_TABLET_UI); + mForceTabletUIDelegate = mDelegate.getForceTabletUIDelegate(); + forceTabletUiPref.setChecked(mForceTabletUIDelegate.isEnabled()); + forceTabletUiPref.setOnPreferenceChangeListener(this); + Preference captions = findPreference(PREF_CAPTIONS); captions.setOnPreferenceClickListener( preference -> { @@ -190,6 +198,8 @@ public class AccessibilitySettings extends PreferenceFragmentCompat mFontSizePrefs.setUserFontScaleFactor((Float) newValue); } else if (PREF_FORCE_ENABLE_ZOOM.equals(preference.getKey())) { mFontSizePrefs.setForceEnableZoomFromUser((Boolean) newValue); + } else if (PREF_FORCE_TABLET_UI.equals(preference.getKey())) { + mForceTabletUIDelegate.setEnabled((Boolean) newValue); } else if (PREF_READER_FOR_ACCESSIBILITY.equals(preference.getKey())) { if (mReaderForAccessibilityDelegate != null) { mReaderForAccessibilityDelegate.setEnabled((Boolean) newValue); 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 @@ -52,6 +52,8 @@ public interface AccessibilitySettingsDelegate { */ IntegerPreferenceDelegate getTextSizeContrastAccessibilityDelegate(); + BooleanPreferenceDelegate getForceTabletUIDelegate(); + /** * Allows the embedder to add more preferences to the preference screen. * 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 @@ -31,6 +31,11 @@ public class DeviceFormFactor { /** Matches the value set in res/values-sw720dp/values.xml */ private static final int SCREEN_BUCKET_LARGET_TABLET = 3; + private static boolean mForceTabletUI; + public static void setForceTabletUI(boolean forceTabletUI) { + mForceTabletUI = forceTabletUI; + } + /** * 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". @@ -56,6 +61,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; } --