Loading build/patches/Move-navigation-bar-to-bottom.patch +169 −89 Original line number Diff line number Diff line Loading @@ -12,81 +12,80 @@ Support for tablet mode is also included. Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html --- cc/base/features.cc | 4 ++ cc/base/features.cc | 4 + cc/base/features.h | 1 + cc/input/browser_controls_offset_manager.cc | 6 +++ cc/trees/layer_tree_host_impl.cc | 3 ++ cc/input/browser_controls_offset_manager.cc | 6 ++ cc/trees/layer_tree_host_impl.cc | 3 + .../start_surface/StartSurfaceMediator.java | 5 ++ .../tab_management/TabGroupUiCoordinator.java | 7 ++- .../tab_management/TabGroupUiMediator.java | 50 +++++++++++++++++- .../tab_management/TabGroupUiProperties.java | 6 ++- .../tab_management/TabGroupUiToolbarView.java | 18 +++++++ .../tab_management/TabGroupUiViewBinder.java | 3 ++ .../TabListContainerViewBinder.java | 4 ++ .../tab_management/TabListCoordinator.java | 6 +++ .../tab_management/TabListRecyclerView.java | 19 ++++++- .../tab_management/TabSwitcherMediator.java | 16 ++++++ .../ChromeAccessibilitySettingsDelegate.java | 52 +++++++++++++++++++ .../chrome/browser/app/ChromeActivity.java | 13 +++++ .../tab_management/TabGroupUiCoordinator.java | 7 +- .../tab_management/TabGroupUiMediator.java | 50 +++++++++++- .../tab_management/TabGroupUiProperties.java | 6 +- .../tab_management/TabGroupUiToolbarView.java | 18 +++++ .../tab_management/TabGroupUiViewBinder.java | 3 + .../tab_management/TabListCoordinator.java | 77 +++++++++++++++++++ .../tab_management/TabListRecyclerView.java | 19 ++++- .../tab_management/TabSwitcherMediator.java | 19 +++++ .../ChromeAccessibilitySettingsDelegate.java | 52 +++++++++++++ .../chrome/browser/app/ChromeActivity.java | 13 ++++ .../browser/app/flags/ChromeCachedFlags.java | 1 + .../compositor/CompositorViewHolder.java | 6 +++ .../layouts/LayoutManagerChrome.java | 18 +++++-- .../compositor/CompositorViewHolder.java | 6 ++ .../layouts/LayoutManagerChrome.java | 18 ++++- .../layouts/LayoutManagerChromeTablet.java | 4 +- .../layouts/ToolbarSwipeLayout.java | 15 +++++- .../layouts/ToolbarSwipeLayout.java | 15 +++- .../overlays/strip/StripLayoutHelper.java | 2 +- .../strip/StripLayoutHelperManager.java | 36 +++++++++++-- .../scene_layer/StaticTabSceneLayer.java | 8 ++- .../scene_layer/TabListSceneLayer.java | 14 +++++ .../scene_layer/TabStripSceneLayer.java | 15 +++++- .../browser/findinpage/FindToolbarTablet.java | 11 ++-- .../fullscreen/BrowserControlsManager.java | 13 +++++ .../messages/MessageContainerCoordinator.java | 17 +++++- .../strip/StripLayoutHelperManager.java | 36 +++++++-- .../scene_layer/StaticTabSceneLayer.java | 8 +- .../scene_layer/TabListSceneLayer.java | 14 ++++ .../scene_layer/TabStripSceneLayer.java | 15 +++- .../browser/findinpage/FindToolbarTablet.java | 11 ++- .../fullscreen/BrowserControlsManager.java | 13 ++++ .../messages/MessageContainerCoordinator.java | 17 +++- .../modaldialog/ChromeTabModalPresenter.java | 2 +- .../chrome/browser/ntp/NewTabPage.java | 13 +++-- .../chrome/browser/ntp/RecentTabsPage.java | 22 ++++++-- .../browser/searchwidget/SearchActivity.java | 13 ++++- .../chrome/browser/ntp/NewTabPage.java | 13 +++- .../chrome/browser/ntp/RecentTabsPage.java | 22 +++++- .../browser/searchwidget/SearchActivity.java | 13 +++- .../browser/settings/SettingsActivity.java | 5 ++ .../StatusIndicatorCoordinator.java | 10 ++++ .../StatusIndicatorSceneLayer.java | 7 ++- .../browser/toolbar/ToolbarManager.java | 37 +++++++++++-- .../chrome/browser/ui/BottomContainer.java | 19 +++++++ .../ui/system/StatusBarColorController.java | 9 ++++ .../StatusIndicatorCoordinator.java | 10 +++ .../StatusIndicatorSceneLayer.java | 7 +- .../browser/toolbar/ToolbarManager.java | 37 +++++++-- .../chrome/browser/ui/BottomContainer.java | 19 +++++ .../ui/system/StatusBarColorController.java | 9 +++ chrome/browser/about_flags.cc | 5 ++ .../scene_layer/tab_strip_scene_layer.cc | 16 ++++-- .../BrowserControlsMarginSupplier.java | 6 +++ .../BrowserControlsStateProvider.java | 6 +++ chrome/browser/flag_descriptions.cc | 4 ++ chrome/browser/flag_descriptions.h | 3 ++ .../flags/android/cached_feature_flags.cc | 18 +++++++ .../scene_layer/tab_strip_scene_layer.cc | 16 +++- .../BrowserControlsMarginSupplier.java | 6 ++ .../BrowserControlsStateProvider.java | 6 ++ chrome/browser/flag_descriptions.cc | 4 + chrome/browser/flag_descriptions.h | 3 + .../flags/android/cached_feature_flags.cc | 18 +++++ .../flags/android/chrome_feature_list.cc | 2 + .../browser/flags/CachedFeatureFlags.java | 19 +++++++ .../browser/flags/ChromeFeatureList.java | 4 ++ .../chrome/browser/ui/appmenu/AppMenu.java | 30 +++++++++++ .../ui/appmenu/AppMenuHandlerImpl.java | 11 ++++ .../omnibox/LocationBarCoordinator.java | 9 +++- .../browser/omnibox/UrlBarCoordinator.java | 11 +++- .../suggestions/AutocompleteCoordinator.java | 18 ++++++- .../suggestions/AutocompleteMediator.java | 7 ++- .../OmniboxSuggestionsDropdown.java | 22 +++++++- .../OmniboxSuggestionsDropdownEmbedder.java | 4 ++ .../strings/android_chrome_strings.grd | 6 +++ .../browser/flags/CachedFeatureFlags.java | 19 +++++ .../browser/flags/ChromeFeatureList.java | 4 + .../chrome/browser/ui/appmenu/AppMenu.java | 30 ++++++++ .../ui/appmenu/AppMenuHandlerImpl.java | 11 +++ .../omnibox/LocationBarCoordinator.java | 9 ++- .../browser/omnibox/UrlBarCoordinator.java | 11 ++- .../suggestions/AutocompleteCoordinator.java | 18 ++++- .../suggestions/AutocompleteMediator.java | 7 +- .../OmniboxSuggestionsDropdown.java | 22 +++++- .../OmniboxSuggestionsDropdownEmbedder.java | 4 + .../strings/android_chrome_strings.grd | 6 ++ chrome/browser/ui/android/toolbar/BUILD.gn | 1 + .../toolbar/LocationBarFocusScrimHandler.java | 7 +++ .../bottom/BottomControlsContentDelegate.java | 9 +++- .../bottom/BottomControlsCoordinator.java | 11 +++- .../bottom/BottomControlsMediator.java | 9 ++++ .../toolbar/LocationBarFocusScrimHandler.java | 7 ++ .../bottom/BottomControlsContentDelegate.java | 9 ++- .../bottom/BottomControlsCoordinator.java | 11 ++- .../bottom/BottomControlsMediator.java | 9 +++ .../bottom/BottomControlsProperties.java | 5 +- .../bottom/BottomControlsViewBinder.java | 2 + .../bottom/ScrollingBottomViewSceneLayer.java | 20 ++++++- .../toolbar/top/ToolbarControlContainer.java | 11 ++++ .../top/TopToolbarOverlayCoordinator.java | 7 +++ .../top/TopToolbarOverlayProperties.java | 8 ++- .../toolbar/top/TopToolbarSceneLayer.java | 11 +++- .../res/xml/accessibility_preferences.xml | 4 ++ .../accessibility/AccessibilitySettings.java | 16 ++++++ .../AccessibilitySettingsDelegate.java | 6 +++ .../render_widget_host_view_android.cc | 3 ++ 74 files changed, 784 insertions(+), 57 deletions(-) .../bottom/ScrollingBottomViewSceneLayer.java | 20 ++++- .../toolbar/top/ToolbarControlContainer.java | 11 +++ .../top/TopToolbarOverlayCoordinator.java | 7 ++ .../top/TopToolbarOverlayProperties.java | 8 +- .../toolbar/top/TopToolbarSceneLayer.java | 11 ++- .../res/xml/accessibility_preferences.xml | 4 + .../accessibility/AccessibilitySettings.java | 16 ++++ .../AccessibilitySettingsDelegate.java | 6 ++ .../render_widget_host_view_android.cc | 3 + 73 files changed, 854 insertions(+), 57 deletions(-) diff --git a/cc/base/features.cc b/cc/base/features.cc --- a/cc/base/features.cc Loading Loading @@ -390,31 +389,18 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser } } } diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java @@ -21,6 +21,8 @@ import androidx.recyclerview.widget.LinearLayoutManager; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.chrome.browser.flags.CachedFeatureFlags; +import org.chromium.chrome.browser.flags.ChromeFeatureList; /** * ViewBinder for TabListRecyclerView. @@ -57,6 +59,8 @@ class TabListContainerViewBinder { params.topMargin = newTopMargin; view.requestLayout(); } else if (BOTTOM_CONTROLS_HEIGHT == propertyKey) { + if (CachedFeatureFlags.isEnabled(ChromeFeatureList.MOVE_TOP_TOOLBAR_TO_BOTTOM)) + return; FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams(); params.bottomMargin = model.get(BOTTOM_CONTROLS_HEIGHT); view.requestLayout(); diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java @@ -47,6 +47,9 @@ import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter; @@ -7,6 +7,7 @@ package org.chromium.chrome.browser.tasks.tab_management; import static org.chromium.chrome.browser.tasks.tab_management.TabListModel.CardProperties.CARD_TYPE; import android.content.Context; +import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -47,6 +48,9 @@ import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; import org.chromium.ui.widget.ViewLookupCachingFrameLayout; Loading @@ -424,16 +410,100 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.List; @@ -255,6 +258,9 @@ public class TabListCoordinator @@ -95,6 +99,70 @@ public class TabListCoordinator private boolean mLayoutListenerRegistered; private @Nullable TabStripSnapshotter mTabStripSnapshotter; + public class GridLayoutManagerDockBottom extends GridLayoutManager { + Context mContext; + + TabListRecyclerView mRecyclerView; + + int mTopPadding = 99999; + int mLastPosition = -1; + boolean mIsFirstLayout = true; + + public GridLayoutManagerDockBottom(Context context, int spanCount) { + super(context, spanCount); + mContext = context; + } + + public void setTabListRecyclerView(TabListRecyclerView recyclerView) { + mRecyclerView = recyclerView; + } + + public void ResetTopPosition() { + mIsFirstLayout = true; + } + + @Override + public int getPaddingTop() { + if (mContext.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + mTopPadding = 99999; + return 0; + } + if (mTopPadding == 99999) return super.getPaddingTop(); + return mTopPadding; + } + + @Override + public int getPaddingBottom() { + return 1; + } + + @Override + public void scrollToPositionWithOffset(int position, int offset) { + mLastPosition = position; + super.scrollToPositionWithOffset(position, getPaddingBottom()); + } + + @Override + public void onLayoutCompleted(RecyclerView.State state) { + super.onLayoutCompleted(state); + + if (state.isPreLayout()) return; + View lastView = findViewByPosition(findFirstVisibleItemPosition()); + if (lastView != null) { + mTopPadding = Math.min(mTopPadding, mRecyclerView.getHeight() - lastView.getHeight()); + if (mIsFirstLayout) { + mIsFirstLayout = false; + scrollToPositionWithOffset(mLastPosition, 0); + } + } + + if (mLastPosition != -1 && mLastPosition >= state.getItemCount()) { + ResetTopPosition(); + scrollToPositionWithOffset(state.getItemCount()-getSpanCount(), 0); + } + } + } + /** * Construct a coordinator for UI that shows a list of tabs. * @param mode Modes of showing the list of tabs. Can be used in GRID or STRIP. @@ -255,6 +323,12 @@ public class TabListCoordinator if (mMode == TabListMode.GRID) { GridLayoutManager gridLayoutManager = new GridLayoutManager(context, GRID_LAYOUT_SPAN_COUNT_COMPACT); + // invert the order if the toolbar is at bottom + if (titleProvider != null && CachedFeatureFlags.isEnabled(ChromeFeatureList.MOVE_TOP_TOOLBAR_TO_BOTTOM)) + gridLayoutManager.setReverseLayout(true); + if (titleProvider != null && CachedFeatureFlags.isEnabled(ChromeFeatureList.MOVE_TOP_TOOLBAR_TO_BOTTOM)) { + gridLayoutManager = + new GridLayoutManagerDockBottom(context, GRID_LAYOUT_SPAN_COUNT_COMPACT); + ((GridLayoutManagerDockBottom)gridLayoutManager) + .setTabListRecyclerView(mRecyclerView); + } mRecyclerView.setLayoutManager(gridLayoutManager); mMediator.registerOrientationListener(gridLayoutManager); mMediator.updateSpanCount(gridLayoutManager, @@ -434,6 +508,9 @@ public class TabListCoordinator } registerLayoutChangeListener(); mRecyclerView.prepareTabSwitcherView(); + GridLayoutManager glm = (GridLayoutManager) mRecyclerView.getLayoutManager(); + if (glm instanceof GridLayoutManagerDockBottom) + ((GridLayoutManagerDockBottom)glm).ResetTopPosition(); mMediator.prepareTabSwitcherView(); mMediator.registerOnScrolledListener(mRecyclerView); } diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java Loading Loading @@ -550,6 +620,16 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser mContainerViewModel.set(SHADOW_TOP_OFFSET, contentOffset); } @@ -744,6 +760,9 @@ class TabSwitcherMediator implements TabSwitcher.Controller, TabListRecyclerView private void setInitialScrollIndexOffset() { int offset = mMode == TabListMode.CAROUSEL ? INITIAL_SCROLL_INDEX_OFFSET_CAROUSEL : INITIAL_SCROLL_INDEX_OFFSET_GTS; + if (CachedFeatureFlags.isEnabled(ChromeFeatureList.MOVE_TOP_TOOLBAR_TO_BOTTOM)) { + offset = 0; + } int initialPosition = Math.max( mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter().index() - offset, 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 Loading Loading
build/patches/Move-navigation-bar-to-bottom.patch +169 −89 Original line number Diff line number Diff line Loading @@ -12,81 +12,80 @@ Support for tablet mode is also included. Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html --- cc/base/features.cc | 4 ++ cc/base/features.cc | 4 + cc/base/features.h | 1 + cc/input/browser_controls_offset_manager.cc | 6 +++ cc/trees/layer_tree_host_impl.cc | 3 ++ cc/input/browser_controls_offset_manager.cc | 6 ++ cc/trees/layer_tree_host_impl.cc | 3 + .../start_surface/StartSurfaceMediator.java | 5 ++ .../tab_management/TabGroupUiCoordinator.java | 7 ++- .../tab_management/TabGroupUiMediator.java | 50 +++++++++++++++++- .../tab_management/TabGroupUiProperties.java | 6 ++- .../tab_management/TabGroupUiToolbarView.java | 18 +++++++ .../tab_management/TabGroupUiViewBinder.java | 3 ++ .../TabListContainerViewBinder.java | 4 ++ .../tab_management/TabListCoordinator.java | 6 +++ .../tab_management/TabListRecyclerView.java | 19 ++++++- .../tab_management/TabSwitcherMediator.java | 16 ++++++ .../ChromeAccessibilitySettingsDelegate.java | 52 +++++++++++++++++++ .../chrome/browser/app/ChromeActivity.java | 13 +++++ .../tab_management/TabGroupUiCoordinator.java | 7 +- .../tab_management/TabGroupUiMediator.java | 50 +++++++++++- .../tab_management/TabGroupUiProperties.java | 6 +- .../tab_management/TabGroupUiToolbarView.java | 18 +++++ .../tab_management/TabGroupUiViewBinder.java | 3 + .../tab_management/TabListCoordinator.java | 77 +++++++++++++++++++ .../tab_management/TabListRecyclerView.java | 19 ++++- .../tab_management/TabSwitcherMediator.java | 19 +++++ .../ChromeAccessibilitySettingsDelegate.java | 52 +++++++++++++ .../chrome/browser/app/ChromeActivity.java | 13 ++++ .../browser/app/flags/ChromeCachedFlags.java | 1 + .../compositor/CompositorViewHolder.java | 6 +++ .../layouts/LayoutManagerChrome.java | 18 +++++-- .../compositor/CompositorViewHolder.java | 6 ++ .../layouts/LayoutManagerChrome.java | 18 ++++- .../layouts/LayoutManagerChromeTablet.java | 4 +- .../layouts/ToolbarSwipeLayout.java | 15 +++++- .../layouts/ToolbarSwipeLayout.java | 15 +++- .../overlays/strip/StripLayoutHelper.java | 2 +- .../strip/StripLayoutHelperManager.java | 36 +++++++++++-- .../scene_layer/StaticTabSceneLayer.java | 8 ++- .../scene_layer/TabListSceneLayer.java | 14 +++++ .../scene_layer/TabStripSceneLayer.java | 15 +++++- .../browser/findinpage/FindToolbarTablet.java | 11 ++-- .../fullscreen/BrowserControlsManager.java | 13 +++++ .../messages/MessageContainerCoordinator.java | 17 +++++- .../strip/StripLayoutHelperManager.java | 36 +++++++-- .../scene_layer/StaticTabSceneLayer.java | 8 +- .../scene_layer/TabListSceneLayer.java | 14 ++++ .../scene_layer/TabStripSceneLayer.java | 15 +++- .../browser/findinpage/FindToolbarTablet.java | 11 ++- .../fullscreen/BrowserControlsManager.java | 13 ++++ .../messages/MessageContainerCoordinator.java | 17 +++- .../modaldialog/ChromeTabModalPresenter.java | 2 +- .../chrome/browser/ntp/NewTabPage.java | 13 +++-- .../chrome/browser/ntp/RecentTabsPage.java | 22 ++++++-- .../browser/searchwidget/SearchActivity.java | 13 ++++- .../chrome/browser/ntp/NewTabPage.java | 13 +++- .../chrome/browser/ntp/RecentTabsPage.java | 22 +++++- .../browser/searchwidget/SearchActivity.java | 13 +++- .../browser/settings/SettingsActivity.java | 5 ++ .../StatusIndicatorCoordinator.java | 10 ++++ .../StatusIndicatorSceneLayer.java | 7 ++- .../browser/toolbar/ToolbarManager.java | 37 +++++++++++-- .../chrome/browser/ui/BottomContainer.java | 19 +++++++ .../ui/system/StatusBarColorController.java | 9 ++++ .../StatusIndicatorCoordinator.java | 10 +++ .../StatusIndicatorSceneLayer.java | 7 +- .../browser/toolbar/ToolbarManager.java | 37 +++++++-- .../chrome/browser/ui/BottomContainer.java | 19 +++++ .../ui/system/StatusBarColorController.java | 9 +++ chrome/browser/about_flags.cc | 5 ++ .../scene_layer/tab_strip_scene_layer.cc | 16 ++++-- .../BrowserControlsMarginSupplier.java | 6 +++ .../BrowserControlsStateProvider.java | 6 +++ chrome/browser/flag_descriptions.cc | 4 ++ chrome/browser/flag_descriptions.h | 3 ++ .../flags/android/cached_feature_flags.cc | 18 +++++++ .../scene_layer/tab_strip_scene_layer.cc | 16 +++- .../BrowserControlsMarginSupplier.java | 6 ++ .../BrowserControlsStateProvider.java | 6 ++ chrome/browser/flag_descriptions.cc | 4 + chrome/browser/flag_descriptions.h | 3 + .../flags/android/cached_feature_flags.cc | 18 +++++ .../flags/android/chrome_feature_list.cc | 2 + .../browser/flags/CachedFeatureFlags.java | 19 +++++++ .../browser/flags/ChromeFeatureList.java | 4 ++ .../chrome/browser/ui/appmenu/AppMenu.java | 30 +++++++++++ .../ui/appmenu/AppMenuHandlerImpl.java | 11 ++++ .../omnibox/LocationBarCoordinator.java | 9 +++- .../browser/omnibox/UrlBarCoordinator.java | 11 +++- .../suggestions/AutocompleteCoordinator.java | 18 ++++++- .../suggestions/AutocompleteMediator.java | 7 ++- .../OmniboxSuggestionsDropdown.java | 22 +++++++- .../OmniboxSuggestionsDropdownEmbedder.java | 4 ++ .../strings/android_chrome_strings.grd | 6 +++ .../browser/flags/CachedFeatureFlags.java | 19 +++++ .../browser/flags/ChromeFeatureList.java | 4 + .../chrome/browser/ui/appmenu/AppMenu.java | 30 ++++++++ .../ui/appmenu/AppMenuHandlerImpl.java | 11 +++ .../omnibox/LocationBarCoordinator.java | 9 ++- .../browser/omnibox/UrlBarCoordinator.java | 11 ++- .../suggestions/AutocompleteCoordinator.java | 18 ++++- .../suggestions/AutocompleteMediator.java | 7 +- .../OmniboxSuggestionsDropdown.java | 22 +++++- .../OmniboxSuggestionsDropdownEmbedder.java | 4 + .../strings/android_chrome_strings.grd | 6 ++ chrome/browser/ui/android/toolbar/BUILD.gn | 1 + .../toolbar/LocationBarFocusScrimHandler.java | 7 +++ .../bottom/BottomControlsContentDelegate.java | 9 +++- .../bottom/BottomControlsCoordinator.java | 11 +++- .../bottom/BottomControlsMediator.java | 9 ++++ .../toolbar/LocationBarFocusScrimHandler.java | 7 ++ .../bottom/BottomControlsContentDelegate.java | 9 ++- .../bottom/BottomControlsCoordinator.java | 11 ++- .../bottom/BottomControlsMediator.java | 9 +++ .../bottom/BottomControlsProperties.java | 5 +- .../bottom/BottomControlsViewBinder.java | 2 + .../bottom/ScrollingBottomViewSceneLayer.java | 20 ++++++- .../toolbar/top/ToolbarControlContainer.java | 11 ++++ .../top/TopToolbarOverlayCoordinator.java | 7 +++ .../top/TopToolbarOverlayProperties.java | 8 ++- .../toolbar/top/TopToolbarSceneLayer.java | 11 +++- .../res/xml/accessibility_preferences.xml | 4 ++ .../accessibility/AccessibilitySettings.java | 16 ++++++ .../AccessibilitySettingsDelegate.java | 6 +++ .../render_widget_host_view_android.cc | 3 ++ 74 files changed, 784 insertions(+), 57 deletions(-) .../bottom/ScrollingBottomViewSceneLayer.java | 20 ++++- .../toolbar/top/ToolbarControlContainer.java | 11 +++ .../top/TopToolbarOverlayCoordinator.java | 7 ++ .../top/TopToolbarOverlayProperties.java | 8 +- .../toolbar/top/TopToolbarSceneLayer.java | 11 ++- .../res/xml/accessibility_preferences.xml | 4 + .../accessibility/AccessibilitySettings.java | 16 ++++ .../AccessibilitySettingsDelegate.java | 6 ++ .../render_widget_host_view_android.cc | 3 + 73 files changed, 854 insertions(+), 57 deletions(-) diff --git a/cc/base/features.cc b/cc/base/features.cc --- a/cc/base/features.cc Loading Loading @@ -390,31 +389,18 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser } } } diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java @@ -21,6 +21,8 @@ import androidx.recyclerview.widget.LinearLayoutManager; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.chrome.browser.flags.CachedFeatureFlags; +import org.chromium.chrome.browser.flags.ChromeFeatureList; /** * ViewBinder for TabListRecyclerView. @@ -57,6 +59,8 @@ class TabListContainerViewBinder { params.topMargin = newTopMargin; view.requestLayout(); } else if (BOTTOM_CONTROLS_HEIGHT == propertyKey) { + if (CachedFeatureFlags.isEnabled(ChromeFeatureList.MOVE_TOP_TOOLBAR_TO_BOTTOM)) + return; FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams(); params.bottomMargin = model.get(BOTTOM_CONTROLS_HEIGHT); view.requestLayout(); diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java @@ -47,6 +47,9 @@ import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter; @@ -7,6 +7,7 @@ package org.chromium.chrome.browser.tasks.tab_management; import static org.chromium.chrome.browser.tasks.tab_management.TabListModel.CardProperties.CARD_TYPE; import android.content.Context; +import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -47,6 +48,9 @@ import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; import org.chromium.ui.widget.ViewLookupCachingFrameLayout; Loading @@ -424,16 +410,100 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.List; @@ -255,6 +258,9 @@ public class TabListCoordinator @@ -95,6 +99,70 @@ public class TabListCoordinator private boolean mLayoutListenerRegistered; private @Nullable TabStripSnapshotter mTabStripSnapshotter; + public class GridLayoutManagerDockBottom extends GridLayoutManager { + Context mContext; + + TabListRecyclerView mRecyclerView; + + int mTopPadding = 99999; + int mLastPosition = -1; + boolean mIsFirstLayout = true; + + public GridLayoutManagerDockBottom(Context context, int spanCount) { + super(context, spanCount); + mContext = context; + } + + public void setTabListRecyclerView(TabListRecyclerView recyclerView) { + mRecyclerView = recyclerView; + } + + public void ResetTopPosition() { + mIsFirstLayout = true; + } + + @Override + public int getPaddingTop() { + if (mContext.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + mTopPadding = 99999; + return 0; + } + if (mTopPadding == 99999) return super.getPaddingTop(); + return mTopPadding; + } + + @Override + public int getPaddingBottom() { + return 1; + } + + @Override + public void scrollToPositionWithOffset(int position, int offset) { + mLastPosition = position; + super.scrollToPositionWithOffset(position, getPaddingBottom()); + } + + @Override + public void onLayoutCompleted(RecyclerView.State state) { + super.onLayoutCompleted(state); + + if (state.isPreLayout()) return; + View lastView = findViewByPosition(findFirstVisibleItemPosition()); + if (lastView != null) { + mTopPadding = Math.min(mTopPadding, mRecyclerView.getHeight() - lastView.getHeight()); + if (mIsFirstLayout) { + mIsFirstLayout = false; + scrollToPositionWithOffset(mLastPosition, 0); + } + } + + if (mLastPosition != -1 && mLastPosition >= state.getItemCount()) { + ResetTopPosition(); + scrollToPositionWithOffset(state.getItemCount()-getSpanCount(), 0); + } + } + } + /** * Construct a coordinator for UI that shows a list of tabs. * @param mode Modes of showing the list of tabs. Can be used in GRID or STRIP. @@ -255,6 +323,12 @@ public class TabListCoordinator if (mMode == TabListMode.GRID) { GridLayoutManager gridLayoutManager = new GridLayoutManager(context, GRID_LAYOUT_SPAN_COUNT_COMPACT); + // invert the order if the toolbar is at bottom + if (titleProvider != null && CachedFeatureFlags.isEnabled(ChromeFeatureList.MOVE_TOP_TOOLBAR_TO_BOTTOM)) + gridLayoutManager.setReverseLayout(true); + if (titleProvider != null && CachedFeatureFlags.isEnabled(ChromeFeatureList.MOVE_TOP_TOOLBAR_TO_BOTTOM)) { + gridLayoutManager = + new GridLayoutManagerDockBottom(context, GRID_LAYOUT_SPAN_COUNT_COMPACT); + ((GridLayoutManagerDockBottom)gridLayoutManager) + .setTabListRecyclerView(mRecyclerView); + } mRecyclerView.setLayoutManager(gridLayoutManager); mMediator.registerOrientationListener(gridLayoutManager); mMediator.updateSpanCount(gridLayoutManager, @@ -434,6 +508,9 @@ public class TabListCoordinator } registerLayoutChangeListener(); mRecyclerView.prepareTabSwitcherView(); + GridLayoutManager glm = (GridLayoutManager) mRecyclerView.getLayoutManager(); + if (glm instanceof GridLayoutManagerDockBottom) + ((GridLayoutManagerDockBottom)glm).ResetTopPosition(); mMediator.prepareTabSwitcherView(); mMediator.registerOnScrolledListener(mRecyclerView); } diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java Loading Loading @@ -550,6 +620,16 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser mContainerViewModel.set(SHADOW_TOP_OFFSET, contentOffset); } @@ -744,6 +760,9 @@ class TabSwitcherMediator implements TabSwitcher.Controller, TabListRecyclerView private void setInitialScrollIndexOffset() { int offset = mMode == TabListMode.CAROUSEL ? INITIAL_SCROLL_INDEX_OFFSET_CAROUSEL : INITIAL_SCROLL_INDEX_OFFSET_GTS; + if (CachedFeatureFlags.isEnabled(ChromeFeatureList.MOVE_TOP_TOOLBAR_TO_BOTTOM)) { + offset = 0; + } int initialPosition = Math.max( mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter().index() - offset, 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 Loading