Commit 92906410 authored by Yue Zhang's avatar Yue Zhang Committed by Commit Bot

Introduce component for Duet-TabStrip integration

* Separate feature related logic so that Duet and Adaptive toolbar can
  be enabled when flags of TabGroup and Duet-TabStrip integration are
  both on.
* Modify the logic in ToolbarManager so that this CL should be no-op
  when new flag is off and expose integration functionality when new
  flag and duet are both turned on.
* Setup up the basic structure of TabGroupPopUi component and
  specify the entry point and dependencies.

TBR=mdjones@chromium.org

Bug: 1022827
Change-Id: I6e99ec73b5603688c40dc884f8dbdc450961bf6d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1935490Reviewed-by: default avatarYue Zhang <yuezhanggg@chromium.org>
Reviewed-by: default avatarHenrique Nakashima <hnakashima@chromium.org>
Reviewed-by: default avatarWei-Yin Chen (陳威尹) <wychen@chromium.org>
Commit-Queue: Yue Zhang <yuezhanggg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#719380}
parent 7a94d28c
...@@ -112,6 +112,7 @@ android_library("java") { ...@@ -112,6 +112,7 @@ android_library("java") {
"java/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardViewBinder.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardViewBinder.java",
"java/src/org/chromium/chrome/browser/tasks/tab_management/MessageService.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/MessageService.java",
"java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java",
"java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiCoordinator.java",
"java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupTitleEditor.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupTitleEditor.java",
"java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java",
"java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java",
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.tasks.tab_management;
import android.view.View;
import org.chromium.chrome.browser.ChromeActivity;
/**
* Interface for the popup TabGroup UI.
*/
public interface TabGroupPopupUi {
void initializeWithNative(ChromeActivity activity);
View.OnLongClickListener getLongClickListenerForTriggering();
void destroy();
}
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.tasks.tab_management;
import android.view.View;
import org.chromium.base.Callback;
import org.chromium.base.ObservableSupplier;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ThemeColorProvider;
import org.chromium.chrome.browser.lifecycle.Destroyable;
/**
* A coordinator for TabStrip component as a popup window in bottom toolbar.
*/
public class TabGroupPopupUiCoordinator implements TabGroupPopupUi, Destroyable {
private final ThemeColorProvider mThemeColorProvider;
private final ObservableSupplier<View> mAnchorViewSupplier;
private final Callback<View> mAnchorViewSupplierCallback;
private ChromeActivity mActivity;
TabGroupPopupUiCoordinator(
ThemeColorProvider themeColorProvider, ObservableSupplier<View> parentViewSupplier) {
mThemeColorProvider = themeColorProvider;
mAnchorViewSupplier = parentViewSupplier;
mAnchorViewSupplierCallback = this::onAnchorViewChanged;
mAnchorViewSupplier.addObserver(mAnchorViewSupplierCallback);
}
@Override
// TODO(crbug.com/1022827): Narrow down the dependencies required here and in
// TabGroupUiCoordinator instead of passing in ChromeActivity.
public void initializeWithNative(ChromeActivity activity) {
mActivity = activity;
}
private void onAnchorViewChanged(View v) {}
@Override
public View.OnLongClickListener getLongClickListenerForTriggering() {
return v -> true;
}
@Override
public void destroy() {
mAnchorViewSupplier.removeObserver(mAnchorViewSupplierCallback);
}
}
...@@ -5,8 +5,10 @@ ...@@ -5,8 +5,10 @@
package org.chromium.chrome.browser.tasks.tab_management; package org.chromium.chrome.browser.tasks.tab_management;
import android.content.Context; import android.content.Context;
import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.chromium.base.ObservableSupplier;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ThemeColorProvider; import org.chromium.chrome.browser.ThemeColorProvider;
import org.chromium.chrome.browser.compositor.layouts.Layout; import org.chromium.chrome.browser.compositor.layouts.Layout;
...@@ -95,4 +97,14 @@ public interface TabManagementDelegate { ...@@ -95,4 +97,14 @@ public interface TabManagementDelegate {
* @return the {@link TabSuggestions} for the activity * @return the {@link TabSuggestions} for the activity
*/ */
TabSuggestions createTabSuggestions(ChromeActivity activity); TabSuggestions createTabSuggestions(ChromeActivity activity);
/**
* Create the {@link TabGroupPopupUi}.
* @param themeColorProvider The {@link ThemeColorProvider} for this UI.
* @param parentViewSupplier The {@link ObservableSupplier} that provides parent view of this
* component.
* @return The {@link TabGroupPopupUi}.
*/
TabGroupPopupUi createTabGroupPopUi(
ThemeColorProvider themeColorProvider, ObservableSupplier<View> parentViewSupplier);
} }
...@@ -7,8 +7,10 @@ package org.chromium.chrome.browser.tasks.tab_management; ...@@ -7,8 +7,10 @@ package org.chromium.chrome.browser.tasks.tab_management;
import static org.chromium.chrome.browser.tasks.tab_management.TabManagementModuleProvider.SYNTHETIC_TRIAL_POSTFIX; import static org.chromium.chrome.browser.tasks.tab_management.TabManagementModuleProvider.SYNTHETIC_TRIAL_POSTFIX;
import android.content.Context; import android.content.Context;
import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.chromium.base.ObservableSupplier;
import org.chromium.base.annotations.UsedByReflection; import org.chromium.base.annotations.UsedByReflection;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeFeatureList;
...@@ -92,4 +94,10 @@ public class TabManagementDelegateImpl implements TabManagementDelegate { ...@@ -92,4 +94,10 @@ public class TabManagementDelegateImpl implements TabManagementDelegate {
return new TabSuggestionsOrchestrator( return new TabSuggestionsOrchestrator(
activity.getTabModelSelector(), activity.getLifecycleDispatcher()); activity.getTabModelSelector(), activity.getLifecycleDispatcher());
} }
@Override
public TabGroupPopupUi createTabGroupPopUi(
ThemeColorProvider themeColorProvider, ObservableSupplier<View> parentViewSupplier) {
return new TabGroupPopupUiCoordinator(themeColorProvider, parentViewSupplier);
}
} }
...@@ -12,6 +12,7 @@ public_tab_management_java_sources = [ ...@@ -12,6 +12,7 @@ public_tab_management_java_sources = [
"//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter.java",
"//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_groups/EmptyTabGroupModelFilterObserver.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_groups/EmptyTabGroupModelFilterObserver.java",
"//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUi.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUi.java",
"//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUi.java",
"//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java",
"//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementModuleProvider.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementModuleProvider.java",
"//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java",
......
...@@ -255,7 +255,7 @@ public class FeatureUtilities { ...@@ -255,7 +255,7 @@ public class FeatureUtilities {
return isFlagEnabled(ChromePreferenceKeys.BOTTOM_TOOLBAR_ENABLED_KEY, false) return isFlagEnabled(ChromePreferenceKeys.BOTTOM_TOOLBAR_ENABLED_KEY, false)
&& !DeviceFormFactor.isNonMultiDisplayContextOnTablet( && !DeviceFormFactor.isNonMultiDisplayContextOnTablet(
ContextUtils.getApplicationContext()) ContextUtils.getApplicationContext())
&& !isTabGroupsAndroidEnabled(); && (isDuetTabStripIntegrationAndroidEnabled() || !isTabGroupsAndroidEnabled());
} }
/** /**
...@@ -271,7 +271,8 @@ public class FeatureUtilities { ...@@ -271,7 +271,8 @@ public class FeatureUtilities {
*/ */
public static boolean isAdaptiveToolbarEnabled() { public static boolean isAdaptiveToolbarEnabled() {
return isFlagEnabled(ChromePreferenceKeys.ADAPTIVE_TOOLBAR_ENABLED_KEY, true) return isFlagEnabled(ChromePreferenceKeys.ADAPTIVE_TOOLBAR_ENABLED_KEY, true)
&& isBottomToolbarEnabled() && !isGridTabSwitcherEnabled(); && isBottomToolbarEnabled()
&& (isDuetTabStripIntegrationAndroidEnabled() || !isGridTabSwitcherEnabled());
} }
/** /**
......
...@@ -87,6 +87,8 @@ import org.chromium.chrome.browser.tabmodel.TabModelObserver; ...@@ -87,6 +87,8 @@ import org.chromium.chrome.browser.tabmodel.TabModelObserver;
import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
import org.chromium.chrome.browser.tabmodel.TabSelectionType; import org.chromium.chrome.browser.tabmodel.TabSelectionType;
import org.chromium.chrome.browser.tasks.tab_management.TabGroupPopupUi;
import org.chromium.chrome.browser.tasks.tab_management.TabManagementModuleProvider;
import org.chromium.chrome.browser.toolbar.bottom.BottomControlsCoordinator; import org.chromium.chrome.browser.toolbar.bottom.BottomControlsCoordinator;
import org.chromium.chrome.browser.toolbar.bottom.BottomTabSwitcherActionMenuCoordinator; import org.chromium.chrome.browser.toolbar.bottom.BottomTabSwitcherActionMenuCoordinator;
import org.chromium.chrome.browser.toolbar.top.ActionModeController; import org.chromium.chrome.browser.toolbar.top.ActionModeController;
...@@ -197,6 +199,8 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF ...@@ -197,6 +199,8 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
private final Callback<ShareDelegate> mShareDelegateSupplierCallback; private final Callback<ShareDelegate> mShareDelegateSupplierCallback;
private ObservableSupplierImpl<OnClickListener> mShareButtonListenerSupplier = private ObservableSupplierImpl<OnClickListener> mShareButtonListenerSupplier =
new ObservableSupplierImpl<>(); new ObservableSupplierImpl<>();
private ObservableSupplierImpl<View> mTabGroupPopUiParentSupplier;
private @Nullable TabGroupPopupUi mTabGroupPopupUi;
private TabObserver mTabObserver; private TabObserver mTabObserver;
private BookmarkBridge.BookmarkModelObserver mBookmarksObserver; private BookmarkBridge.BookmarkModelObserver mBookmarksObserver;
...@@ -782,12 +786,21 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF ...@@ -782,12 +786,21 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
setUrlBarFocus(true, LocationBar.OmniboxFocusReason.ACCELERATOR_TAP); setUrlBarFocus(true, LocationBar.OmniboxFocusReason.ACCELERATOR_TAP);
}; };
if (FeatureUtilities.isDuetTabStripIntegrationAndroidEnabled()
&& FeatureUtilities.isBottomToolbarEnabled()) {
mTabGroupPopUiParentSupplier = new ObservableSupplierImpl<>();
mTabGroupPopupUi = TabManagementModuleProvider.getDelegate().createTabGroupPopUi(
mAppThemeColorProvider, mTabGroupPopUiParentSupplier);
}
mBottomControlsCoordinator = new BottomControlsCoordinator(mActivity.getFullscreenManager(), mBottomControlsCoordinator = new BottomControlsCoordinator(mActivity.getFullscreenManager(),
mActivity.findViewById(R.id.bottom_controls_stub), mActivity.findViewById(R.id.bottom_controls_stub),
mActivity.getActivityTabProvider(), homeButtonListener, searchAcceleratorListener, mActivity.getActivityTabProvider(), homeButtonListener, searchAcceleratorListener,
mShareButtonListenerSupplier, mShareButtonListenerSupplier,
BottomTabSwitcherActionMenuCoordinator.createOnLongClickListener( mTabGroupPopupUi != null
id -> mActivity.onOptionsItemSelected(id, null)), ? mTabGroupPopupUi.getLongClickListenerForTriggering()
: BottomTabSwitcherActionMenuCoordinator.createOnLongClickListener(
id -> mActivity.onOptionsItemSelected(id, null)),
mAppThemeColorProvider); mAppThemeColorProvider);
mIsBottomToolbarVisible = FeatureUtilities.isBottomToolbarEnabled() mIsBottomToolbarVisible = FeatureUtilities.isBottomToolbarEnabled()
...@@ -960,7 +973,9 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF ...@@ -960,7 +973,9 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
OnLongClickListener tabSwitcherLongClickHandler = null; OnLongClickListener tabSwitcherLongClickHandler = null;
if (ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_SWITCHER_LONGPRESS_MENU)) { if (mTabGroupPopupUi != null) {
tabSwitcherLongClickHandler = mTabGroupPopupUi.getLongClickListenerForTriggering();
} else if (ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_SWITCHER_LONGPRESS_MENU)) {
tabSwitcherLongClickHandler = tabSwitcherLongClickHandler =
TabSwitcherActionMenuCoordinator.createOnLongClickListener( TabSwitcherActionMenuCoordinator.createOnLongClickListener(
(id) -> mActivity.onOptionsItemSelected(id, null)); (id) -> mActivity.onOptionsItemSelected(id, null));
...@@ -983,6 +998,13 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF ...@@ -983,6 +998,13 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
} }
}); });
if (mTabGroupPopupUi != null) {
mTabGroupPopUiParentSupplier.set(mIsBottomToolbarVisible
? mActivity.findViewById(R.id.bottom_controls)
: mActivity.findViewById(R.id.toolbar));
mTabGroupPopupUi.initializeWithNative(mActivity);
}
mLocationBarModel.initializeWithNative(); mLocationBarModel.initializeWithNative();
mLocationBarModel.setShouldShowOmniboxInOverviewMode( mLocationBarModel.setShouldShowOmniboxInOverviewMode(
FeatureUtilities.isStartSurfaceEnabled()); FeatureUtilities.isStartSurfaceEnabled());
...@@ -1249,6 +1271,11 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF ...@@ -1249,6 +1271,11 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
mLocationBar.removeUrlFocusChangeListener(this); mLocationBar.removeUrlFocusChangeListener(this);
} }
if (mTabGroupPopupUi != null) {
mTabGroupPopupUi.destroy();
mTabGroupPopupUi = null;
}
mToolbar.removeUrlExpansionObserver(mActivity.getStatusBarColorController()); mToolbar.removeUrlExpansionObserver(mActivity.getStatusBarColorController());
mToolbar.destroy(); mToolbar.destroy();
...@@ -1293,6 +1320,12 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF ...@@ -1293,6 +1320,12 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
mAppMenuButtonHelper.setMenuShowsFromBottom(mIsBottomToolbarVisible); mAppMenuButtonHelper.setMenuShowsFromBottom(mIsBottomToolbarVisible);
} }
mIdentityDiscController.updateButtonState(); mIdentityDiscController.updateButtonState();
if (mTabGroupPopupUi != null) {
mTabGroupPopUiParentSupplier.set(mIsBottomToolbarVisible
? mActivity.findViewById(R.id.bottom_controls)
: mActivity.findViewById(R.id.toolbar));
}
} }
} }
......
...@@ -102,7 +102,9 @@ public class BottomControlsCoordinator { ...@@ -102,7 +102,9 @@ public class BottomControlsCoordinator {
root.getResources().getDimensionPixelOffset(bottomToolbarHeightWithShadowId)); root.getResources().getDimensionPixelOffset(bottomToolbarHeightWithShadowId));
if (TabManagementModuleProvider.getDelegate() != null if (TabManagementModuleProvider.getDelegate() != null
&& FeatureUtilities.isTabGroupsAndroidEnabled()) { && FeatureUtilities.isTabGroupsAndroidEnabled()
&& !(FeatureUtilities.isDuetTabStripIntegrationAndroidEnabled()
&& FeatureUtilities.isBottomToolbarEnabled())) {
mTabGroupUi = TabManagementModuleProvider.getDelegate().createTabGroupUi( mTabGroupUi = TabManagementModuleProvider.getDelegate().createTabGroupUi(
root.findViewById(R.id.bottom_container_slot), themeColorProvider); root.findViewById(R.id.bottom_container_slot), themeColorProvider);
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment