blob: f9434b697978e35e2d885aad334f275bc200af68 [file] [log] [blame]
// Copyright 2018 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.autofill.keyboard_accessory;
import android.support.annotation.Nullable;
import android.support.annotation.Px;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.ViewStub;
import org.chromium.base.Supplier;
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.modelutil.LazyViewBinderAdapter;
import org.chromium.chrome.browser.modelutil.ListModelChangeProcessor;
import org.chromium.chrome.browser.modelutil.PropertyModelChangeProcessor;
/**
* Creates and owns all elements which are part of the accessory sheet component.
* It's part of the controller but will mainly forward events (like showing the sheet) and handle
* communication with the {@link ManualFillingCoordinator} (e.g. add a tab to trigger the sheet).
* to the {@link AccessorySheetMediator}.
*/
public class AccessorySheetCoordinator {
private final AccessorySheetMediator mMediator;
private final Supplier<ViewPager.OnPageChangeListener> mProvider;
/**
* Creates the sheet component by instantiating Model, View and Controller before wiring these
* parts up.
* @param viewStub The view stub that can be inflated into the accessory layout.
* @param provider The provider of a {@link ViewPager.OnPageChangeListener} used for navigation.
*/
public AccessorySheetCoordinator(
ViewStub viewStub, Supplier<ViewPager.OnPageChangeListener> provider) {
mProvider = provider;
LazyViewBinderAdapter.StubHolder<ViewPager> stubHolder =
new LazyViewBinderAdapter.StubHolder<>(viewStub);
AccessorySheetModel model = new AccessorySheetModel();
model.addObserver(new PropertyModelChangeProcessor<>(model, stubHolder,
new LazyViewBinderAdapter<>(
new AccessorySheetViewBinder(), this::onViewInflated)));
KeyboardAccessoryMetricsRecorder.registerMetricsObserver(model);
mMediator = new AccessorySheetMediator(model);
}
/**
* Creates the {@link PagerAdapter} for the newly inflated {@link ViewPager}.
* The created adapter observes the given model for item changes and updates the view pager.
* @param model The model containing the list of tabs to be displayed.
* @return A fully initialized {@link PagerAdapter}.
*/
static PagerAdapter createTabViewAdapter(AccessorySheetModel model, ViewPager inflatedView) {
AccessoryPagerAdapter adapter = new AccessoryPagerAdapter(model.getTabList());
model.getTabList().addObserver(
new ListModelChangeProcessor<>(model.getTabList(), inflatedView, adapter));
return adapter;
}
/**
* Called by the {@link LazyViewBinderAdapter} as soon as the view is inflated so it can be
* initialized. This call happens before the {@link AccessorySheetViewBinder} is called for the
* first time.
*/
private void onViewInflated(ViewPager view) {
view.addOnPageChangeListener(mProvider.get());
}
/**
* Adds the contents of a given {@link KeyboardAccessoryData.Tab} to the accessory sheet. If it
* is the first Tab, it automatically becomes the active Tab.
* Careful, if you want to show this tab as icon in the KeyboardAccessory, use the method
* {@link ManualFillingCoordinator#addTab(KeyboardAccessoryData.Tab)} instead.
* @param tab The tab which should be added to the AccessorySheet.
*/
void addTab(KeyboardAccessoryData.Tab tab) {
mMediator.addTab(tab);
}
void removeTab(KeyboardAccessoryData.Tab tab) {
mMediator.removeTab(tab);
}
void setTabs(KeyboardAccessoryData.Tab[] tabs) {
mMediator.setTabs(tabs);
}
/**
* Returns a {@link KeyboardAccessoryData.Tab} object that is used to display this bottom sheet.
* @return Returns a {@link KeyboardAccessoryData.Tab}.
*/
@Nullable
public KeyboardAccessoryData.Tab getTab() {
return mMediator.getTab();
}
/**
* Sets the height of the accessory sheet (i.e. adapts to keyboard heights).
* @param height The height of the sheet in pixels.
*/
public void setHeight(@Px int height) {
mMediator.setHeight(height);
}
/**
* Gets the height of the accessory sheet (even if not visible).
* @return The height of the sheet in pixels.
*/
public @Px int getHeight() {
return mMediator.getHeight();
}
/**
* Shows the Accessory Sheet.
*/
public void show() {
mMediator.show();
}
/**
* Hides the Accessory Sheet.
*/
public void hide() {
mMediator.hide();
}
/**
* Returns whether the accessory sheet is currently visible.
* @return True, if the accessory sheet is visible.
*/
public boolean isShown() {
return mMediator.isShown();
}
@VisibleForTesting
AccessorySheetMediator getMediatorForTesting() {
return mMediator;
}
/**
* Calling this function changes the active tab to the tab at the given |position|.
* @param position The index of the tab (starting with 0) that should be set active.
*/
public void setActiveTab(int position) {
mMediator.setActiveTab(position);
}
}