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") {
"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/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/TabGroupUiCoordinator.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 @@
package org.chromium.chrome.browser.tasks.tab_management;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import org.chromium.base.ObservableSupplier;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ThemeColorProvider;
import org.chromium.chrome.browser.compositor.layouts.Layout;
......@@ -95,4 +97,14 @@ public interface TabManagementDelegate {
* @return the {@link TabSuggestions} for the 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;
import static org.chromium.chrome.browser.tasks.tab_management.TabManagementModuleProvider.SYNTHETIC_TRIAL_POSTFIX;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import org.chromium.base.ObservableSupplier;
import org.chromium.base.annotations.UsedByReflection;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ChromeFeatureList;
......@@ -92,4 +94,10 @@ public class TabManagementDelegateImpl implements TabManagementDelegate {
return new TabSuggestionsOrchestrator(
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 = [
"//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_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/TabManagementModuleProvider.java",
"//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java",
......
......@@ -255,7 +255,7 @@ public class FeatureUtilities {
return isFlagEnabled(ChromePreferenceKeys.BOTTOM_TOOLBAR_ENABLED_KEY, false)
&& !DeviceFormFactor.isNonMultiDisplayContextOnTablet(
ContextUtils.getApplicationContext())
&& !isTabGroupsAndroidEnabled();
&& (isDuetTabStripIntegrationAndroidEnabled() || !isTabGroupsAndroidEnabled());
}
/**
......@@ -271,7 +271,8 @@ public class FeatureUtilities {
*/
public static boolean isAdaptiveToolbarEnabled() {
return isFlagEnabled(ChromePreferenceKeys.ADAPTIVE_TOOLBAR_ENABLED_KEY, true)
&& isBottomToolbarEnabled() && !isGridTabSwitcherEnabled();
&& isBottomToolbarEnabled()
&& (isDuetTabStripIntegrationAndroidEnabled() || !isGridTabSwitcherEnabled());
}
/**
......
......@@ -87,6 +87,8 @@ import org.chromium.chrome.browser.tabmodel.TabModelObserver;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
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.BottomTabSwitcherActionMenuCoordinator;
import org.chromium.chrome.browser.toolbar.top.ActionModeController;
......@@ -197,6 +199,8 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
private final Callback<ShareDelegate> mShareDelegateSupplierCallback;
private ObservableSupplierImpl<OnClickListener> mShareButtonListenerSupplier =
new ObservableSupplierImpl<>();
private ObservableSupplierImpl<View> mTabGroupPopUiParentSupplier;
private @Nullable TabGroupPopupUi mTabGroupPopupUi;
private TabObserver mTabObserver;
private BookmarkBridge.BookmarkModelObserver mBookmarksObserver;
......@@ -782,12 +786,21 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
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(),
mActivity.findViewById(R.id.bottom_controls_stub),
mActivity.getActivityTabProvider(), homeButtonListener, searchAcceleratorListener,
mShareButtonListenerSupplier,
BottomTabSwitcherActionMenuCoordinator.createOnLongClickListener(
id -> mActivity.onOptionsItemSelected(id, null)),
mTabGroupPopupUi != null
? mTabGroupPopupUi.getLongClickListenerForTriggering()
: BottomTabSwitcherActionMenuCoordinator.createOnLongClickListener(
id -> mActivity.onOptionsItemSelected(id, null)),
mAppThemeColorProvider);
mIsBottomToolbarVisible = FeatureUtilities.isBottomToolbarEnabled()
......@@ -960,7 +973,9 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
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 =
TabSwitcherActionMenuCoordinator.createOnLongClickListener(
(id) -> mActivity.onOptionsItemSelected(id, null));
......@@ -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.setShouldShowOmniboxInOverviewMode(
FeatureUtilities.isStartSurfaceEnabled());
......@@ -1249,6 +1271,11 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
mLocationBar.removeUrlFocusChangeListener(this);
}
if (mTabGroupPopupUi != null) {
mTabGroupPopupUi.destroy();
mTabGroupPopupUi = null;
}
mToolbar.removeUrlExpansionObserver(mActivity.getStatusBarColorController());
mToolbar.destroy();
......@@ -1293,6 +1320,12 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
mAppMenuButtonHelper.setMenuShowsFromBottom(mIsBottomToolbarVisible);
}
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 {
root.getResources().getDimensionPixelOffset(bottomToolbarHeightWithShadowId));
if (TabManagementModuleProvider.getDelegate() != null
&& FeatureUtilities.isTabGroupsAndroidEnabled()) {
&& FeatureUtilities.isTabGroupsAndroidEnabled()
&& !(FeatureUtilities.isDuetTabStripIntegrationAndroidEnabled()
&& FeatureUtilities.isBottomToolbarEnabled())) {
mTabGroupUi = TabManagementModuleProvider.getDelegate().createTabGroupUi(
root.findViewById(R.id.bottom_container_slot), themeColorProvider);
} 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