Commit 2fcdbf19 authored by Friedrich Horschig's avatar Friedrich Horschig Committed by Commit Bot

[Mfill Android] Collapse all sheet methods into single code path

This CL collapses all code-paths for accessory sheets into one.
All sheets now have common classes for coordinator, mediator and model.
For the ViewBinders, this would make no sense (since they are static
classes used to implement interfaces anyway) and Views are largely
shared anyway.
The wiring is only partly hidden in these super classes since it would
be too difficult to find the connection between ViewBinder, Model and
Coordinator if we would just require interfaces [1].

Minor, intentional clean-ups:
 - Credit Cards now have a UserInfo type representation.
 - The address sheet isn't any longer in V2 but instead guarded by the
   same flag as the credit card sheet.

[1] I tried and reverted it. It pretty much takes 300 more lines away
but then, the whole component becomes very in-transparent.

Details to follow.

Bug: 902425
Change-Id: Ia44694f72418b5f27a021569bfb3e70a19f24201
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1634736
Commit-Queue: Friedrich [CET] <fhorschig@chromium.org>
Reviewed-by: default avatarIoana Pandele <ioanap@chromium.org>
Cr-Commit-Position: refs/heads/master@{#666231}
parent 67605b97
...@@ -54,17 +54,16 @@ android_library("internal_java") { ...@@ -54,17 +54,16 @@ android_library("internal_java") {
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetViewBinder.java", "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetViewBinder.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/NoSwipeViewPager.java", "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/NoSwipeViewPager.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabCoordinator.java", "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabCoordinator.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabMediator.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabMetricsRecorder.java", "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabMetricsRecorder.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabModel.java", "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabModel.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewBinder.java", "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewBinder.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessoryInfoView.java", "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessoryInfoView.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetCoordinator.java", "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetCoordinator.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetMediator.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetViewBinder.java", "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetViewBinder.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetCoordinator.java", "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetCoordinator.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessoryInfoView.java", "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessoryInfoView.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetCoordinator.java", "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetCoordinator.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetMediator.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java", "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewBinder.java", "java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewBinder.java",
"java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java", "java/src/org/chromium/chrome/browser/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java",
......
...@@ -6,6 +6,7 @@ package org.chromium.chrome.browser.keyboard_accessory; ...@@ -6,6 +6,7 @@ package org.chromium.chrome.browser.keyboard_accessory;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.support.annotation.Px; import android.support.annotation.Px;
import android.util.SparseArray;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
...@@ -21,10 +22,8 @@ import org.chromium.content_public.browser.WebContents; ...@@ -21,10 +22,8 @@ import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
class ManualFillingComponentBridge { class ManualFillingComponentBridge {
private final PropertyProvider<AccessorySheetData> mPasswordSheetProvider = private final SparseArray<PropertyProvider<AccessorySheetData>> mProviders =
new PropertyProvider<>(); new SparseArray<>();
private final PropertyProvider<AccessorySheetData> mAddressSheetProvider =
new PropertyProvider<>();
private final PropertyProvider<Action[]> mActionProvider = private final PropertyProvider<Action[]> mActionProvider =
new PropertyProvider<>(AccessoryAction.GENERATE_PASSWORD_AUTOMATIC); new PropertyProvider<>(AccessoryAction.GENERATE_PASSWORD_AUTOMATIC);
private final ManualFillingComponent mManualFillingComponent; private final ManualFillingComponent mManualFillingComponent;
...@@ -35,12 +34,18 @@ class ManualFillingComponentBridge { ...@@ -35,12 +34,18 @@ class ManualFillingComponentBridge {
mNativeView = nativeView; mNativeView = nativeView;
mActivity = (ChromeActivity) windowAndroid.getActivity().get(); mActivity = (ChromeActivity) windowAndroid.getActivity().get();
mManualFillingComponent = mActivity.getManualFillingComponent(); mManualFillingComponent = mActivity.getManualFillingComponent();
mManualFillingComponent.registerPasswordProvider(mPasswordSheetProvider);
mManualFillingComponent.registerAddressProvider(mAddressSheetProvider);
mManualFillingComponent.registerCreditCardProvider();
mManualFillingComponent.registerActionProvider(mActionProvider); mManualFillingComponent.registerActionProvider(mActionProvider);
} }
PropertyProvider<AccessorySheetData> getOrCreateProvider(@AccessoryTabType int tabType) {
PropertyProvider<AccessorySheetData> provider = mProviders.get(tabType);
if (provider != null) return provider;
provider = new PropertyProvider<>();
mProviders.put(tabType, provider);
mManualFillingComponent.registerSheetDataProvider(tabType, provider);
return provider;
}
@CalledByNative @CalledByNative
private static ManualFillingComponentBridge create( private static ManualFillingComponentBridge create(
long nativeView, WindowAndroid windowAndroid) { long nativeView, WindowAndroid windowAndroid) {
...@@ -50,17 +55,7 @@ class ManualFillingComponentBridge { ...@@ -50,17 +55,7 @@ class ManualFillingComponentBridge {
@CalledByNative @CalledByNative
private void onItemsAvailable(Object objAccessorySheetData) { private void onItemsAvailable(Object objAccessorySheetData) {
AccessorySheetData accessorySheetData = (AccessorySheetData) objAccessorySheetData; AccessorySheetData accessorySheetData = (AccessorySheetData) objAccessorySheetData;
switch (accessorySheetData.getSheetType()) { getOrCreateProvider(accessorySheetData.getSheetType()).notifyObservers(accessorySheetData);
case AccessoryTabType.PASSWORDS:
mPasswordSheetProvider.notifyObservers((AccessorySheetData) objAccessorySheetData);
return;
case AccessoryTabType.CREDIT_CARDS:
// TODO(crbug.com/926365): Implement.
return;
case AccessoryTabType.ADDRESSES:
mAddressSheetProvider.notifyObservers((AccessorySheetData) objAccessorySheetData);
return;
}
} }
@CalledByNative @CalledByNative
...@@ -117,8 +112,9 @@ class ManualFillingComponentBridge { ...@@ -117,8 +112,9 @@ class ManualFillingComponentBridge {
@CalledByNative @CalledByNative
private void destroy() { private void destroy() {
mPasswordSheetProvider.notifyObservers(null); for (int i = 0; i < mProviders.size(); ++i) {
mAddressSheetProvider.notifyObservers(null); mProviders.valueAt(i).notifyObservers(null);
}
mNativeView = 0; mNativeView = 0;
} }
......
...@@ -88,20 +88,9 @@ class ManualFillingCoordinator implements ManualFillingComponent { ...@@ -88,20 +88,9 @@ class ManualFillingCoordinator implements ManualFillingComponent {
} }
@Override @Override
public void registerPasswordProvider( public void registerSheetDataProvider(@AccessoryTabType int sheetType,
PropertyProvider<KeyboardAccessoryData.AccessorySheetData> sheetDataProvider) { PropertyProvider<KeyboardAccessoryData.AccessorySheetData> sheetDataProvider) {
mMediator.registerPasswordProvider(sheetDataProvider); mMediator.registerSheetDataProvider(sheetType, sheetDataProvider);
}
@Override
public void registerAddressProvider(
PropertyProvider<KeyboardAccessoryData.AccessorySheetData> sheetDataProvider) {
mMediator.registerAddressProvider(sheetDataProvider);
}
@Override
public void registerCreditCardProvider() {
mMediator.registerCreditCardProvider();
} }
@Override @Override
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package org.chromium.chrome.browser.keyboard_accessory; package org.chromium.chrome.browser.keyboard_accessory;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.util.SparseArray;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.keyboard_accessory.data.CachedProviderAdapter; import org.chromium.chrome.browser.keyboard_accessory.data.CachedProviderAdapter;
...@@ -12,9 +13,7 @@ import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData ...@@ -12,9 +13,7 @@ import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData
import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData; import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
import org.chromium.chrome.browser.keyboard_accessory.data.PropertyProvider; import org.chromium.chrome.browser.keyboard_accessory.data.PropertyProvider;
import org.chromium.chrome.browser.keyboard_accessory.data.Provider; import org.chromium.chrome.browser.keyboard_accessory.data.Provider;
import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AddressAccessorySheetCoordinator; import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabCoordinator;
import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.CreditCardAccessorySheetCoordinator;
import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.PasswordAccessorySheetCoordinator;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.WebContentsObserver; import org.chromium.content_public.browser.WebContentsObserver;
...@@ -25,14 +24,23 @@ import java.util.ArrayList; ...@@ -25,14 +24,23 @@ import java.util.ArrayList;
* and its sheet for the {@link WebContents} it is attached to. * and its sheet for the {@link WebContents} it is attached to.
*/ */
class ManualFillingState { class ManualFillingState {
private final static int[] TAB_ORDER = {
AccessoryTabType.PASSWORDS, AccessoryTabType.CREDIT_CARDS, AccessoryTabType.ADDRESSES};
private final WebContents mWebContents; private final WebContents mWebContents;
private boolean mWebContentsShowing; private final SparseArray<SheetState> mSheetStates = new SparseArray<>();
private @Nullable CachedProviderAdapter<KeyboardAccessoryData.Action[]> mActionsProvider; private @Nullable CachedProviderAdapter<KeyboardAccessoryData.Action[]> mActionsProvider;
private @Nullable CachedProviderAdapter<AccessorySheetData> mPasswordSheetDataProvider; private boolean mWebContentsShowing;
private @Nullable CachedProviderAdapter<AccessorySheetData> mAddressSheetDataProvider;
private @Nullable PasswordAccessorySheetCoordinator mPasswordAccessorySheet; private static class SheetState {
private @Nullable AddressAccessorySheetCoordinator mAddressAccessorySheet; @Nullable
private @Nullable CreditCardAccessorySheetCoordinator mCreditCardAccessorySheet; CachedProviderAdapter<AccessorySheetData> mDataProvider;
@Nullable
AccessorySheetTabCoordinator mSheet;
void notifyProviderObservers() {
if (mDataProvider != null) mDataProvider.notifyAboutCachedItems();
}
}
private class Observer extends WebContentsObserver { private class Observer extends WebContentsObserver {
public Observer(WebContents webContents) { public Observer(WebContents webContents) {
...@@ -44,8 +52,9 @@ class ManualFillingState { ...@@ -44,8 +52,9 @@ class ManualFillingState {
super.wasShown(); super.wasShown();
mWebContentsShowing = true; mWebContentsShowing = true;
if (mActionsProvider != null) mActionsProvider.notifyAboutCachedItems(); if (mActionsProvider != null) mActionsProvider.notifyAboutCachedItems();
if (mPasswordSheetDataProvider != null) for (int state : TAB_ORDER) {
mPasswordSheetDataProvider.notifyAboutCachedItems(); getStateFor(state).notifyProviderObservers();
}
} }
@Override @Override
...@@ -78,27 +87,37 @@ class ManualFillingState { ...@@ -78,27 +87,37 @@ class ManualFillingState {
*/ */
void notifyObservers() { void notifyObservers() {
if (mActionsProvider != null) mActionsProvider.notifyAboutCachedItems(); if (mActionsProvider != null) mActionsProvider.notifyAboutCachedItems();
if (mPasswordSheetDataProvider != null) mPasswordSheetDataProvider.notifyAboutCachedItems(); for (int state : TAB_ORDER) {
// TODO(fhorschig): This needs controller tests for each state in the order!
getStateFor(state).notifyProviderObservers();
}
} }
KeyboardAccessoryData.Tab[] getTabs() { KeyboardAccessoryData.Tab[] getTabs() {
ArrayList<KeyboardAccessoryData.Tab> tabs = new ArrayList<>(); ArrayList<KeyboardAccessoryData.Tab> tabs = new ArrayList<>();
if (mPasswordAccessorySheet != null) tabs.add(mPasswordAccessorySheet.getTab()); for (@AccessoryTabType int type : TAB_ORDER) {
if (mCreditCardAccessorySheet != null) tabs.add(mCreditCardAccessorySheet.getTab()); SheetState state = getStateFor(type);
if (mAddressAccessorySheet != null) tabs.add(mAddressAccessorySheet.getTab()); if (state.mSheet != null) tabs.add(state.mSheet.getTab());
}
return tabs.toArray(new KeyboardAccessoryData.Tab[0]); return tabs.toArray(new KeyboardAccessoryData.Tab[0]);
} }
void destroy() { void destroy() {
if (mWebContents != null) mWebContents.removeObserver(mWebContentsObserver); if (mWebContents != null) mWebContents.removeObserver(mWebContentsObserver);
mActionsProvider = null; mActionsProvider = null;
mPasswordSheetDataProvider = null; mSheetStates.clear();
mPasswordAccessorySheet = null;
mCreditCardAccessorySheet = null;
mAddressAccessorySheet = null;
mWebContentsShowing = false; mWebContentsShowing = false;
} }
private SheetState getStateFor(@AccessoryTabType int tabType) {
SheetState state = mSheetStates.get(tabType);
if (state == null) {
mSheetStates.put(tabType, new SheetState());
state = mSheetStates.get(tabType);
}
return state;
}
/** /**
* Wraps the given ActionProvider in a {@link CachedProviderAdapter} and stores it. * Wraps the given ActionProvider in a {@link CachedProviderAdapter} and stores it.
* @param provider A {@link PropertyProvider} providing actions. * @param provider A {@link PropertyProvider} providing actions.
...@@ -119,64 +138,31 @@ class ManualFillingState { ...@@ -119,64 +138,31 @@ class ManualFillingState {
} }
/** /**
* Wraps the given provider for password data in a {@link CachedProviderAdapter} and stores it. * Wraps the given provider for sheet data in a {@link CachedProviderAdapter} and stores it.
* @param provider A {@link PropertyProvider} providing password sheet data. * @param provider A {@link PropertyProvider} providing sheet data.
*/ */
void wrapPasswordSheetDataProvider(PropertyProvider<AccessorySheetData> provider) { void wrapSheetDataProvider(
mPasswordSheetDataProvider = @AccessoryTabType int tabType, PropertyProvider<AccessorySheetData> provider) {
getStateFor(tabType).mDataProvider =
new CachedProviderAdapter<>(provider, null, this::onAdapterReceivedNewData); new CachedProviderAdapter<>(provider, null, this::onAdapterReceivedNewData);
} }
/** /**
* Returns the wrapped provider set with {@link #wrapPasswordSheetDataProvider}. * Returns the wrapped provider set with {@link #wrapSheetDataProvider}.
* @return A {@link CachedProviderAdapter} wrapping a {@link PropertyProvider}. * @return A {@link CachedProviderAdapter} wrapping a {@link PropertyProvider}.
*/ */
Provider<AccessorySheetData> getPasswordSheetDataProvider() { Provider<AccessorySheetData> getSheetDataProvider(@AccessoryTabType int tabType) {
return mPasswordSheetDataProvider; return getStateFor(tabType).mDataProvider;
}
void setPasswordAccessorySheet(@Nullable PasswordAccessorySheetCoordinator sheet) {
mPasswordAccessorySheet = sheet;
}
@Nullable
PasswordAccessorySheetCoordinator getPasswordAccessorySheet() {
return mPasswordAccessorySheet;
}
/**
* Wraps the given provider for address data in a {@link CachedProviderAdapter} and stores it.
* @param provider A {@link PropertyProvider} providing password sheet data.
*/
void wrapAddressSheetDataProvider(PropertyProvider<AccessorySheetData> provider) {
mAddressSheetDataProvider =
new CachedProviderAdapter<>(provider, null, this::onAdapterReceivedNewData);
}
/**
* Returns the wrapped provider set with {@link #wrapAddressSheetDataProvider}.
* @return A {@link CachedProviderAdapter} wrapping a {@link PropertyProvider}.
*/
Provider<AccessorySheetData> getAddressSheetDataProvider() {
return mAddressSheetDataProvider;
}
void setAddressAccessorySheet(@Nullable AddressAccessorySheetCoordinator sheet) {
mAddressAccessorySheet = sheet;
}
@Nullable
AddressAccessorySheetCoordinator getAddressAccessorySheet() {
return mAddressAccessorySheet;
} }
void setCreditCardAccessorySheet(@Nullable CreditCardAccessorySheetCoordinator sheet) { void setAccessorySheet(
mCreditCardAccessorySheet = sheet; @AccessoryTabType int tabType, @Nullable AccessorySheetTabCoordinator sheet) {
getStateFor(tabType).mSheet = sheet;
} }
@Nullable @Nullable
CreditCardAccessorySheetCoordinator getCreditCardAccessorySheet() { AccessorySheetTabCoordinator getAccessorySheet(@AccessoryTabType int tabType) {
return mCreditCardAccessorySheet; return getStateFor(tabType).mSheet;
} }
private void onAdapterReceivedNewData(CachedProviderAdapter adapter) { private void onAdapterReceivedNewData(CachedProviderAdapter adapter) {
......
...@@ -13,6 +13,8 @@ import android.view.ViewGroup; ...@@ -13,6 +13,8 @@ import android.view.ViewGroup;
import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType; import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData; import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData;
import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
import org.chromium.chrome.browser.keyboard_accessory.data.Provider;
/** /**
* This coordinator aims to be the base class for sheets to be added to the ManualFillingCoordinator * This coordinator aims to be the base class for sheets to be added to the ManualFillingCoordinator
...@@ -32,7 +34,7 @@ public abstract class AccessorySheetTabCoordinator implements KeyboardAccessoryD ...@@ -32,7 +34,7 @@ public abstract class AccessorySheetTabCoordinator implements KeyboardAccessoryD
* @param tabType The type of this tab as used in histograms. * @param tabType The type of this tab as used in histograms.
* @param scrollListener An optional listener that will be bound to an inflated recycler view. * @param scrollListener An optional listener that will be bound to an inflated recycler view.
*/ */
public AccessorySheetTabCoordinator(String title, Drawable icon, String contentDescription, AccessorySheetTabCoordinator(String title, Drawable icon, String contentDescription,
String openingAnnouncement, @LayoutRes int layout, @AccessoryTabType int tabType, String openingAnnouncement, @LayoutRes int layout, @AccessoryTabType int tabType,
@Nullable RecyclerView.OnScrollListener scrollListener) { @Nullable RecyclerView.OnScrollListener scrollListener) {
mTab = new KeyboardAccessoryData.Tab( mTab = new KeyboardAccessoryData.Tab(
...@@ -46,6 +48,12 @@ public abstract class AccessorySheetTabCoordinator implements KeyboardAccessoryD ...@@ -46,6 +48,12 @@ public abstract class AccessorySheetTabCoordinator implements KeyboardAccessoryD
AccessorySheetTabViewBinder.initializeView((RecyclerView) view, mScrollListener); AccessorySheetTabViewBinder.initializeView((RecyclerView) view, mScrollListener);
} }
@CallSuper
@Override
public void onTabShown() {
getMediator().onTabShown();
}
/** /**
* Returns the Tab object that describes the appearance of this class in the keyboard accessory * Returns the Tab object that describes the appearance of this class in the keyboard accessory
* or its accessory sheet. The returned object doesn't change for this instance. * or its accessory sheet. The returned object doesn't change for this instance.
...@@ -54,4 +62,20 @@ public abstract class AccessorySheetTabCoordinator implements KeyboardAccessoryD ...@@ -54,4 +62,20 @@ public abstract class AccessorySheetTabCoordinator implements KeyboardAccessoryD
public KeyboardAccessoryData.Tab getTab() { public KeyboardAccessoryData.Tab getTab() {
return mTab; return mTab;
} }
/**
* The mediator that is used to process the data pushed from sources added with
* {@link #registerDataProvider(Provider)}.
* @return A {@link Provider.Observer<AccessorySheetData>}.
*/
abstract AccessorySheetTabMediator getMediator();
/**
* Registers the provider pushing a complete new instance of {@link AccessorySheetData} that
* should be displayed as sheet for this tab.
* @param sheetDataProvider A {@link Provider <AccessorySheetData>}.
*/
public void registerDataProvider(Provider<AccessorySheetData> sheetDataProvider) {
sheetDataProvider.addObserver(getMediator());
}
} }
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs; package org.chromium.chrome.browser.keyboard_accessory.sheet_tabs;
import android.support.annotation.CallSuper;
import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType; import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData; import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
...@@ -19,24 +21,30 @@ import java.util.ArrayList; ...@@ -19,24 +21,30 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* This class contains all logic for the address accessory sheet component. Changes to its internal * This class contains the logic for the simple accessory sheets. Changes to its internal
* {@link PropertyModel} are observed by a {@link PropertyModelChangeProcessor} and affect the * {@link PropertyModel} are observed by a {@link PropertyModelChangeProcessor} and affect the
* address accessory sheet tab view. * accessory sheet tab view.
*/ */
class AddressAccessorySheetMediator implements Provider.Observer<AccessorySheetData> { class AccessorySheetTabMediator implements Provider.Observer<AccessorySheetData> {
private final AccessorySheetTabModel mModel; private final AccessorySheetTabModel mModel;
private final @AccessoryTabType int mTabType;
private final @Type int mUserInfoType;
@Override @Override
public void onItemAvailable(int typeId, AccessorySheetData accessorySheetData) { public void onItemAvailable(int typeId, AccessorySheetData accessorySheetData) {
mModel.set(splitIntoDataPieces(accessorySheetData)); mModel.set(splitIntoDataPieces(accessorySheetData));
} }
AddressAccessorySheetMediator(AccessorySheetTabModel model) { AccessorySheetTabMediator(
AccessorySheetTabModel model, @AccessoryTabType int tabType, @Type int userInfoType) {
mModel = model; mModel = model;
mTabType = tabType;
mUserInfoType = userInfoType;
} }
@CallSuper
void onTabShown() { void onTabShown() {
AccessorySheetTabMetricsRecorder.recordSheetSuggestions(AccessoryTabType.ADDRESSES, mModel); AccessorySheetTabMetricsRecorder.recordSheetSuggestions(mTabType, mModel);
} }
private AccessorySheetDataPiece[] splitIntoDataPieces(AccessorySheetData accessorySheetData) { private AccessorySheetDataPiece[] splitIntoDataPieces(AccessorySheetData accessorySheetData) {
...@@ -47,7 +55,7 @@ class AddressAccessorySheetMediator implements Provider.Observer<AccessorySheetD ...@@ -47,7 +55,7 @@ class AddressAccessorySheetMediator implements Provider.Observer<AccessorySheetD
items.add(new AccessorySheetDataPiece(accessorySheetData.getTitle(), Type.TITLE)); items.add(new AccessorySheetDataPiece(accessorySheetData.getTitle(), Type.TITLE));
} }
for (UserInfo userInfo : accessorySheetData.getUserInfoList()) { for (UserInfo userInfo : accessorySheetData.getUserInfoList()) {
items.add(new AccessorySheetDataPiece(userInfo, Type.ADDRESS_INFO)); items.add(new AccessorySheetDataPiece(userInfo, mUserInfoType));
} }
for (FooterCommand command : accessorySheetData.getFooterCommands()) { for (FooterCommand command : accessorySheetData.getFooterCommands()) {
items.add(new AccessorySheetDataPiece(command, Type.FOOTER_COMMAND)); items.add(new AccessorySheetDataPiece(command, Type.FOOTER_COMMAND));
......
...@@ -39,10 +39,14 @@ class AccessorySheetTabModel extends ListModel<AccessorySheetTabModel.AccessoryS ...@@ -39,10 +39,14 @@ class AccessorySheetTabModel extends ListModel<AccessorySheetTabModel.AccessoryS
* A section containing a users name, address, etc. * A section containing a users name, address, etc.
*/ */
int ADDRESS_INFO = 3; int ADDRESS_INFO = 3;
/**
* A section containing a payment information.
*/
int CREDIT_CARD_INFO = 4;
/** /**
* A command at the end of the accessory sheet tab. * A command at the end of the accessory sheet tab.
*/ */
int FOOTER_COMMAND = 4; int FOOTER_COMMAND = 5;
} }
private Object mDataPiece; private Object mDataPiece;
......
...@@ -11,11 +11,12 @@ import android.support.v7.widget.RecyclerView; ...@@ -11,11 +11,12 @@ import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.keyboard_accessory.AccessoryAction;
import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType; import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
import org.chromium.chrome.browser.keyboard_accessory.ManualFillingMetricsRecorder;
import org.chromium.chrome.browser.keyboard_accessory.R; import org.chromium.chrome.browser.keyboard_accessory.R;
import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
import org.chromium.chrome.browser.keyboard_accessory.data.Provider;
import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece; import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type;
import org.chromium.ui.modelutil.RecyclerViewAdapter; import org.chromium.ui.modelutil.RecyclerViewAdapter;
import org.chromium.ui.modelutil.SimpleRecyclerViewMcp; import org.chromium.ui.modelutil.SimpleRecyclerViewMcp;
...@@ -28,6 +29,29 @@ public class AddressAccessorySheetCoordinator extends AccessorySheetTabCoordinat ...@@ -28,6 +29,29 @@ public class AddressAccessorySheetCoordinator extends AccessorySheetTabCoordinat
private final AddressAccessorySheetMediator mMediator = private final AddressAccessorySheetMediator mMediator =
new AddressAccessorySheetMediator(mModel); new AddressAccessorySheetMediator(mModel);
/**
* This class contains all logic for the address accessory sheet component. Changes to its
* internal
* {@link PropertyModel} are observed by a {@link PropertyModelChangeProcessor} and affect the
* address accessory sheet tab view.
*/
private static class AddressAccessorySheetMediator extends AccessorySheetTabMediator {
AddressAccessorySheetMediator(AccessorySheetTabModel model) {
super(model, AccessoryTabType.ADDRESSES, Type.ADDRESS_INFO);
}
@Override
void onTabShown() {
super.onTabShown();
// This is a compromise: we log an impression, even if the user didn't scroll down far
// enough to see it. If we moved it into the view layer (i.e. when the actual button is
// created and shown), we could record multiple impressions of the user scrolls up and
// down repeatedly.
ManualFillingMetricsRecorder.recordActionImpression(AccessoryAction.MANAGE_ADDRESSES);
}
}
/** /**
* Creates the address tab. * Creates the address tab.
* @param context The {@link Context} containing resources like icons and layouts for this tab. * @param context The {@link Context} containing resources like icons and layouts for this tab.
...@@ -49,17 +73,8 @@ public class AddressAccessorySheetCoordinator extends AccessorySheetTabCoordinat ...@@ -49,17 +73,8 @@ public class AddressAccessorySheetCoordinator extends AccessorySheetTabCoordinat
} }
@Override @Override
public void onTabShown() { protected AccessorySheetTabMediator getMediator() {
mMediator.onTabShown(); return mMediator;
}
/**
* Registers the provider pushing a complete new instance of {@link AccessorySheetData} that
* should be displayed as sheet for this tab.
* @param accessorySheetDataProvider A {@link Provider <AccessorySheetData>}.
*/
public void registerDataProvider(Provider<AccessorySheetData> accessorySheetDataProvider) {
accessorySheetDataProvider.addObserver(mMediator);
} }
/** /**
......
...@@ -11,12 +11,18 @@ import android.support.v7.widget.RecyclerView; ...@@ -11,12 +11,18 @@ import android.support.v7.widget.RecyclerView;
import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType; import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
import org.chromium.chrome.browser.keyboard_accessory.R; import org.chromium.chrome.browser.keyboard_accessory.R;
import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type;
/** /**
* This component is a tab that can be added to the ManualFillingCoordinator. This tab * This component is a tab that can be added to the ManualFillingCoordinator. This tab
* allows selecting credit card information from a sheet below the keyboard accessory. * allows selecting credit card information from a sheet below the keyboard accessory.
*/ */
public class CreditCardAccessorySheetCoordinator extends AccessorySheetTabCoordinator { public class CreditCardAccessorySheetCoordinator extends AccessorySheetTabCoordinator {
private AccessorySheetTabModel mModel = new AccessorySheetTabModel();
// TODO(crbug.com/926365): Consider creating a mediator for CCs (e.g. to record footer metrics).
private final AccessorySheetTabMediator mMediator = new AccessorySheetTabMediator(
mModel, AccessoryTabType.CREDIT_CARDS, Type.CREDIT_CARD_INFO);
/** /**
* Creates the credit cards tab. * Creates the credit cards tab.
* @param context The {@link Context} containing resources like icons and layouts for this tab. * @param context The {@link Context} containing resources like icons and layouts for this tab.
...@@ -35,5 +41,7 @@ public class CreditCardAccessorySheetCoordinator extends AccessorySheetTabCoordi ...@@ -35,5 +41,7 @@ public class CreditCardAccessorySheetCoordinator extends AccessorySheetTabCoordi
} }
@Override @Override
public void onTabShown() {} protected AccessorySheetTabMediator getMediator() {
return mMediator;
}
} }
...@@ -13,11 +13,12 @@ import android.view.ViewGroup; ...@@ -13,11 +13,12 @@ import android.view.ViewGroup;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.keyboard_accessory.AccessoryAction;
import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType; import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
import org.chromium.chrome.browser.keyboard_accessory.ManualFillingMetricsRecorder;
import org.chromium.chrome.browser.keyboard_accessory.R; import org.chromium.chrome.browser.keyboard_accessory.R;
import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
import org.chromium.chrome.browser.keyboard_accessory.data.Provider;
import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece; import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type;
import org.chromium.ui.modelutil.ListModel; import org.chromium.ui.modelutil.ListModel;
import org.chromium.ui.modelutil.RecyclerViewAdapter; import org.chromium.ui.modelutil.RecyclerViewAdapter;
import org.chromium.ui.modelutil.SimpleRecyclerViewMcp; import org.chromium.ui.modelutil.SimpleRecyclerViewMcp;
...@@ -30,6 +31,29 @@ public class PasswordAccessorySheetCoordinator extends AccessorySheetTabCoordina ...@@ -30,6 +31,29 @@ public class PasswordAccessorySheetCoordinator extends AccessorySheetTabCoordina
private final AccessorySheetTabModel mModel = new AccessorySheetTabModel(); private final AccessorySheetTabModel mModel = new AccessorySheetTabModel();
private final PasswordAccessorySheetMediator mMediator; private final PasswordAccessorySheetMediator mMediator;
/**
* This class contains all logic for the password accessory sheet component. Changes to its
* internal
* {@link PropertyModel} are observed by a {@link PropertyModelChangeProcessor} and affect the
* password accessory sheet tab view.
*/
private static class PasswordAccessorySheetMediator extends AccessorySheetTabMediator {
PasswordAccessorySheetMediator(AccessorySheetTabModel model) {
super(model, AccessoryTabType.PASSWORDS, Type.PASSWORD_INFO);
}
@Override
void onTabShown() {
super.onTabShown();
// This is a compromise: we log an impression, even if the user didn't scroll down far
// enough to see it. If we moved it into the view layer (i.e. when the actual button is
// created and shown), we could record multiple impressions of the user scrolls up and
// down repeatedly.
ManualFillingMetricsRecorder.recordActionImpression(AccessoryAction.MANAGE_PASSWORDS);
}
}
/** /**
* Provides the icon used in this sheet. Simplifies mocking in controller tests. * Provides the icon used in this sheet. Simplifies mocking in controller tests.
*/ */
...@@ -86,17 +110,8 @@ public class PasswordAccessorySheetCoordinator extends AccessorySheetTabCoordina ...@@ -86,17 +110,8 @@ public class PasswordAccessorySheetCoordinator extends AccessorySheetTabCoordina
} }
@Override @Override
public void onTabShown() { protected AccessorySheetTabMediator getMediator() {
mMediator.onTabShown(); return mMediator;
}
/**
* Registers the provider pushing a complete new instance of {@link AccessorySheetData} that
* should be displayed as sheet for this tab.
* @param accessorySheetDataProvider A {@link Provider<AccessorySheetData>}.
*/
public void registerDataProvider(Provider<AccessorySheetData> accessorySheetDataProvider) {
accessorySheetDataProvider.addObserver(mMediator);
} }
/** /**
......
// 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.keyboard_accessory.sheet_tabs;
import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.keyboard_accessory.AccessoryAction;
import org.chromium.chrome.browser.keyboard_accessory.AccessoryTabType;
import org.chromium.chrome.browser.keyboard_accessory.ManualFillingMetricsRecorder;
import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.FooterCommand;
import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData.UserInfo;
import org.chromium.chrome.browser.keyboard_accessory.data.Provider;
import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece;
import org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
import java.util.ArrayList;
import java.util.List;
/**
* This class contains all logic for the password accessory sheet component. Changes to its internal
* {@link PropertyModel} are observed by a {@link PropertyModelChangeProcessor} and affect the
* password accessory sheet tab view.
*/
class PasswordAccessorySheetMediator implements Provider.Observer<AccessorySheetData> {
private final AccessorySheetTabModel mModel;
@Override
public void onItemAvailable(int typeId, AccessorySheetData accessorySheetData) {
mModel.set(splitIntoDataPieces(accessorySheetData));
}
PasswordAccessorySheetMediator(AccessorySheetTabModel model) {
mModel = model;
}
void onTabShown() {
ManualFillingMetricsRecorder.recordActionImpression(AccessoryAction.MANAGE_PASSWORDS);
AccessorySheetTabMetricsRecorder.recordSheetSuggestions(AccessoryTabType.PASSWORDS, mModel);
}
private AccessorySheetDataPiece[] splitIntoDataPieces(AccessorySheetData accessorySheetData) {
if (accessorySheetData == null) return new AccessorySheetDataPiece[0];
List<AccessorySheetDataPiece> items = new ArrayList<>();
if (shouldShowTitle(accessorySheetData.getUserInfoList())) {
items.add(new AccessorySheetDataPiece(accessorySheetData.getTitle(), Type.TITLE));
}
for (UserInfo userInfo : accessorySheetData.getUserInfoList()) {
items.add(new AccessorySheetDataPiece(userInfo, Type.PASSWORD_INFO));
}
for (FooterCommand command : accessorySheetData.getFooterCommands()) {
items.add(new AccessorySheetDataPiece(command, Type.FOOTER_COMMAND));
}
return items.toArray(new AccessorySheetDataPiece[0]);
}
private boolean shouldShowTitle(List<UserInfo> userInfoList) {
return !ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY)
|| userInfoList.isEmpty();
}
}
...@@ -114,7 +114,8 @@ public class ManualFillingTestHelper { ...@@ -114,7 +114,8 @@ public class ManualFillingTestHelper {
final ImeAdapter imeAdapter = ImeAdapter.fromWebContents(mWebContentsRef.get()); final ImeAdapter imeAdapter = ImeAdapter.fromWebContents(mWebContentsRef.get());
mInputMethodManagerWrapper = TestInputMethodManagerWrapper.create(imeAdapter); mInputMethodManagerWrapper = TestInputMethodManagerWrapper.create(imeAdapter);
imeAdapter.setInputMethodManagerWrapper(mInputMethodManagerWrapper); imeAdapter.setInputMethodManagerWrapper(mInputMethodManagerWrapper);
getManualFillingCoordinator().registerPasswordProvider(mSheetSuggestionsProvider); getManualFillingCoordinator().registerSheetDataProvider(
AccessoryTabType.PASSWORDS, mSheetSuggestionsProvider);
}); });
if (waitForNode) DOMUtils.waitForNonZeroNodeBounds(mWebContentsRef.get(), PASSWORD_NODE_ID); if (waitForNode) DOMUtils.waitForNonZeroNodeBounds(mWebContentsRef.get(), PASSWORD_NODE_ID);
cacheCredentials(new String[0], new String[0]); // This caches the empty state. cacheCredentials(new String[0], new String[0]); // This caches the empty state.
...@@ -254,11 +255,15 @@ public class ManualFillingTestHelper { ...@@ -254,11 +255,15 @@ public class ManualFillingTestHelper {
} }
public PasswordAccessorySheetCoordinator getOrCreatePasswordAccessorySheet() { public PasswordAccessorySheetCoordinator getOrCreatePasswordAccessorySheet() {
return getManualFillingCoordinator().getMediatorForTesting().getOrCreatePasswordSheet(); return (PasswordAccessorySheetCoordinator) getManualFillingCoordinator()
.getMediatorForTesting()
.getOrCreateSheet(AccessoryTabType.PASSWORDS);
} }
public AddressAccessorySheetCoordinator getOrCreateAddressAccessorySheet() { public AddressAccessorySheetCoordinator getOrCreateAddressAccessorySheet() {
return getManualFillingCoordinator().getMediatorForTesting().getOrCreateAddressSheet(); return (AddressAccessorySheetCoordinator) getManualFillingCoordinator()
.getMediatorForTesting()
.getOrCreateSheet(AccessoryTabType.ADDRESSES);
} }
// ---------------------------------- // ----------------------------------
......
...@@ -58,7 +58,8 @@ import java.util.concurrent.TimeoutException; ...@@ -58,7 +58,8 @@ import java.util.concurrent.TimeoutException;
*/ */
@RunWith(ChromeJUnit4ClassRunner.class) @RunWith(ChromeJUnit4ClassRunner.class)
@RetryOnFailure @RetryOnFailure
@EnableFeatures({ChromeFeatureList.PASSWORDS_KEYBOARD_ACCESSORY}) @EnableFeatures({ChromeFeatureList.PASSWORDS_KEYBOARD_ACCESSORY,
ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY})
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
public class AddressAccessoryIntegrationTest { public class AddressAccessoryIntegrationTest {
@Rule @Rule
...@@ -84,7 +85,7 @@ public class AddressAccessoryIntegrationTest { ...@@ -84,7 +85,7 @@ public class AddressAccessoryIntegrationTest {
@Test @Test
@SmallTest @SmallTest
@EnableFeatures({ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY}) @EnableFeatures({ChromeFeatureList.AUTOFILL_MANUAL_FALLBACK_ANDROID})
public void testAddressSheetIsAvailable() throws InterruptedException { public void testAddressSheetIsAvailable() throws InterruptedException {
mHelper.loadTestPage(false); mHelper.loadTestPage(false);
...@@ -95,7 +96,7 @@ public class AddressAccessoryIntegrationTest { ...@@ -95,7 +96,7 @@ public class AddressAccessoryIntegrationTest {
@Test @Test
@SmallTest @SmallTest
@DisableFeatures({ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY}) @DisableFeatures({ChromeFeatureList.AUTOFILL_MANUAL_FALLBACK_ANDROID})
public void testAddressSheetUnavailableWithoutFeature() throws InterruptedException { public void testAddressSheetUnavailableWithoutFeature() throws InterruptedException {
mHelper.loadTestPage(false); mHelper.loadTestPage(false);
...@@ -105,7 +106,7 @@ public class AddressAccessoryIntegrationTest { ...@@ -105,7 +106,7 @@ public class AddressAccessoryIntegrationTest {
@Test @Test
@SmallTest @SmallTest
@EnableFeatures({ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY}) @EnableFeatures({ChromeFeatureList.AUTOFILL_MANUAL_FALLBACK_ANDROID})
public void testDisplaysEmptyStateMessageWithoutSavedPasswords() public void testDisplaysEmptyStateMessageWithoutSavedPasswords()
throws InterruptedException, TimeoutException { throws InterruptedException, TimeoutException {
mHelper.loadTestPage(false); mHelper.loadTestPage(false);
...@@ -125,7 +126,7 @@ public class AddressAccessoryIntegrationTest { ...@@ -125,7 +126,7 @@ public class AddressAccessoryIntegrationTest {
@Test @Test
@MediumTest @MediumTest
@EnableFeatures({ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY}) @EnableFeatures({ChromeFeatureList.AUTOFILL_MANUAL_FALLBACK_ANDROID})
public void testFillsSuggestionOnClick() public void testFillsSuggestionOnClick()
throws ExecutionException, InterruptedException, TimeoutException { throws ExecutionException, InterruptedException, TimeoutException {
loadTestPage(FakeKeyboard::new); loadTestPage(FakeKeyboard::new);
......
...@@ -53,26 +53,14 @@ public interface ManualFillingComponent { ...@@ -53,26 +53,14 @@ public interface ManualFillingComponent {
void notifyPopupAvailable(DropdownPopupWindow popup); void notifyPopupAvailable(DropdownPopupWindow popup);
/** /**
* By registering this provider, an empty tab for passwords is created. Call * By registering a provider, an empty tab of the given tab type is created. Call
* {@link PropertyProvider#notifyObservers(Object)} to fill or update the sheet. * {@link PropertyProvider#notifyObservers(Object)} to fill or update the sheet.
* @param sheetType The type of sheet to instantiate and to provide data for.
* @param sheetDataProvider The {@link PropertyProvider} the tab will get it's data from. * @param sheetDataProvider The {@link PropertyProvider} the tab will get it's data from.
*/ */
void registerPasswordProvider( void registerSheetDataProvider(@AccessoryTabType int sheetType,
PropertyProvider<KeyboardAccessoryData.AccessorySheetData> sheetDataProvider); PropertyProvider<KeyboardAccessoryData.AccessorySheetData> sheetDataProvider);
/**
* By registering this provider, an empty tab for addresses is created. Call
* {@link PropertyProvider#notifyObservers(Object)} to fill or update the sheet.
* @param sheetDataProvider The {@link PropertyProvider} the tab will get it's data from.
*/
void registerAddressProvider(
PropertyProvider<KeyboardAccessoryData.AccessorySheetData> sheetDataProvider);
/**
* By calling this function, an empty tab for credit cards is created.
*/
void registerCreditCardProvider();
/** /**
* Registers a provider, to provide actions for the keyboard accessory bar. Call * Registers a provider, to provide actions for the keyboard accessory bar. Call
* {@link PropertyProvider#notifyObservers(Object)} to fill or update the actions. * {@link PropertyProvider#notifyObservers(Object)} to fill or update the actions.
......
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