// Copyright 2016 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.payments.ui;
import org.chromium.chrome.R;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import javax.annotation.Nullable;
/**
* The data to show in a single section where the user can select something, e.g., their
* shipping address or payment method.
*/
public class SectionInformation {
/**
* This value indicates that the user has not made a selection in this section.
*/
public static final int NO_SELECTION = -1;
/**
* This value indicates that user selection is invalid in this section.
*/
public static final int INVALID_SELECTION = -2;
@PaymentRequestUI.DataType private final int mDataType;
private ArrayList<PaymentOption> mItems;
private int mSelectedItem;
/**
* Builds an empty section without selection.
*/
public SectionInformation(@PaymentRequestUI.DataType int sectionType) {
this(sectionType, null);
}
/**
* Builds a section with a single option, which is selected.
*
* @param defaultItem The only item. It is selected by default.
*/
public SectionInformation(@PaymentRequestUI.DataType int sectionType,
@Nullable PaymentOption defaultItem) {
this(sectionType, 0, defaultItem == null ? null : Arrays.asList(defaultItem));
}
/**
* Builds a section.
*
* @param sectionType Type of data being stored.
* @param selection The index of the currently selected item.
* @param itemCollection The items in the section.
*/
public SectionInformation(@PaymentRequestUI.DataType int sectionType, int selection,
Collection<? extends PaymentOption> itemCollection) {
mDataType = sectionType;
if (itemCollection == null || itemCollection.isEmpty()) {
mSelectedItem = NO_SELECTION;
mItems = null;
} else {
mSelectedItem = selection;
mItems = new ArrayList<PaymentOption>(itemCollection.size());
mItems.addAll(itemCollection);
}
}
/**
* Returns whether the section is empty.
*
* @return Whether the section is empty.
*/
public boolean isEmpty() {
return mItems == null || mItems.isEmpty();
}
/**
* Returns the number of items in this section. For example, the number of shipping addresses or
* payment methods.
*
* @return The number of items in this section.
*/
public int getSize() {
return mItems == null ? 0 : mItems.size();
}
/**
* Returns the item in the given position.
*
* @param position The index of the item to return.
* @return The item in the given position or null.
*/
public PaymentOption getItem(int position) {
if (mItems == null || mItems.isEmpty() || position < 0 || position >= mItems.size()) {
return null;
}
return mItems.get(position);
}
/**
* Sets the currently selected item by index.
*
* @param index The index of the currently selected item, NO_SELECTION if a selection has not
* yet been made, or INVALID_SELECTION if an invalid selection has been made.
*/
public void setSelectedItemIndex(int index) {
mSelectedItem = index;
}
/**
* Sets the currently selected item.
*
* @param selectedItem The currently selected item, or null of a selection has not yet been
* made.
*/
public void setSelectedItem(PaymentOption selectedItem) {
if (mItems == null) return;
for (int i = 0; i < mItems.size(); i++) {
if (mItems.get(i) == selectedItem) {
mSelectedItem = i;
return;
}
}
}
/**
* Returns the index of the selected item.
*
* @return The index of the currently selected item, NO_SELECTION if a selection has not yet
* been made, or INVALID_SELECTION if an invalid selection has been made.
*/
public int getSelectedItemIndex() {
return mSelectedItem;
}
/**
* Returns the selected item, if any.
*
* @return The selected item or null if none selected.
*/
public PaymentOption getSelectedItem() {
return getItem(getSelectedItemIndex());
}
/**
* Adds the given item at the head of the list and selects it.
*
* @param item The item to add.
*/
public void addAndSelectItem(PaymentOption item) {
if (mItems == null) mItems = new ArrayList<>();
mItems.add(0, item);
mSelectedItem = 0;
}
/**
* Returns the resource ID for the string telling users that they can add a new option.
*
* @return ID if the user can add a new option, or 0 if they can't.
*/
public int getAddStringId() {
if (mDataType == PaymentRequestUI.TYPE_SHIPPING_ADDRESSES) {
return R.string.autofill_create_profile;
} else if (mDataType == PaymentRequestUI.TYPE_CONTACT_DETAILS) {
return R.string.payments_add_contact;
} else if (mDataType == PaymentRequestUI.TYPE_PAYMENT_METHODS) {
return R.string.payments_create_card;
}
return 0;
}
}