blob: 03b79efc44808f0401d5c0fce7586c0aafd6c1dd [file] [log] [blame]
// 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.content.Context;
import android.graphics.Rect;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.flags.FeatureUtilities;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.ui.modelutil.PropertyModel;
import java.util.List;
/**
* A coordinator for TabGridDialog component. Manages the communication with
* {@link TabListCoordinator} as well as the life-cycle of shared component
* objects.
*/
public class TabGridDialogCoordinator implements TabGridDialogMediator.DialogController {
private final String mComponentName;
private final TabListCoordinator mTabListCoordinator;
private final TabGridDialogMediator mMediator;
private final PropertyModel mToolbarPropertyModel;
private final TabGridPanelToolbarCoordinator mToolbarCoordinator;
private final TabSelectionEditorCoordinator mTabSelectionEditorCoordinator;
private final TabGridDialogParent mParentLayout;
TabGridDialogCoordinator(Context context, TabModelSelector tabModelSelector,
TabContentManager tabContentManager, TabCreatorManager tabCreatorManager,
ViewGroup containerView, TabSwitcherMediator.ResetHandler resetHandler,
TabListMediator.GridCardOnClickListenerProvider gridCardOnClickListenerProvider,
TabGridDialogMediator.AnimationSourceViewProvider animationSourceViewProvider,
TabGroupTitleEditor tabGroupTitleEditor) {
mComponentName = animationSourceViewProvider == null ? "TabGridDialogFromStrip"
: "TabGridDialogInSwitcher";
mToolbarPropertyModel = new PropertyModel(TabGridPanelProperties.ALL_KEYS);
mParentLayout = new TabGridDialogParent(context, containerView);
TabSelectionEditorCoordinator.TabSelectionEditorController controller = null;
if (FeatureUtilities.isTabGroupsAndroidContinuationEnabled()) {
mTabSelectionEditorCoordinator = new TabSelectionEditorCoordinator(
context, containerView, tabModelSelector, tabContentManager, mParentLayout);
controller = mTabSelectionEditorCoordinator.getController();
} else {
mTabSelectionEditorCoordinator = null;
}
mMediator = new TabGridDialogMediator(context, this, mToolbarPropertyModel,
tabModelSelector, tabCreatorManager, resetHandler, animationSourceViewProvider,
controller, tabGroupTitleEditor, mComponentName);
mTabListCoordinator = new TabListCoordinator(TabListCoordinator.TabListMode.GRID, context,
tabModelSelector, tabContentManager::getTabThumbnailWithCallback, null, false, null,
gridCardOnClickListenerProvider, mMediator.getTabGridDialogHandler(),
TabProperties.UiType.CLOSABLE, null, containerView, null, false, mComponentName);
TabListRecyclerView recyclerView = mTabListCoordinator.getContainerView();
mToolbarCoordinator = new TabGridPanelToolbarCoordinator(
context, recyclerView, mToolbarPropertyModel, mParentLayout);
}
/**
* Destroy any members that needs clean up.
*/
public void destroy() {
mTabListCoordinator.destroy();
mMediator.destroy();
mToolbarCoordinator.destroy();
mParentLayout.destroy();
if (mTabSelectionEditorCoordinator != null) {
mTabSelectionEditorCoordinator.destroy();
}
if (mToolbarCoordinator != null) {
mToolbarCoordinator.destroy();
}
}
boolean isVisible() {
return mMediator.isVisible();
}
@NonNull
Rect getGlobalLocationOfCurrentThumbnail() {
mTabListCoordinator.updateThumbnailLocation();
Rect thumbnail = mTabListCoordinator.getThumbnailLocationOfCurrentTab();
Rect recyclerViewLocation = mTabListCoordinator.getRecyclerViewLocation();
thumbnail.offset(recyclerViewLocation.left, recyclerViewLocation.top);
return thumbnail;
}
TabGridDialogMediator.DialogController getDialogController() {
return this;
}
@Override
public void resetWithListOfTabs(@Nullable List<Tab> tabs) {
mTabListCoordinator.resetWithListOfTabs(tabs);
mMediator.onReset(tabs);
}
@Override
public void hideDialog(boolean showAnimation) {
mMediator.hideDialog(showAnimation);
}
@Override
public boolean handleBackPressed() {
if (!isVisible()) return false;
mMediator.hideDialog(true);
RecordUserAction.record("TabGridDialog.Exit");
return true;
}
}