package com.marvinlabs.widget.floatinglabel.itemchooser; import android.content.Context; import android.os.Bundle; import android.os.Parcelable; import android.util.AttributeSet; import android.view.View; import android.widget.TextView; import com.marvinlabs.widget.floatinglabel.FloatingLabelTextViewBase; import com.marvinlabs.widget.floatinglabel.LabelAnimator; import com.marvinlabs.widget.floatinglabel.R; import com.marvinlabs.widget.floatinglabel.anim.TextViewLabelAnimator; /** * A widget to choose and hold an item * <p/> * Created by Vincent Mimoun-Prat @ MarvinLabs, 28/08/2014. */ public class FloatingLabelItemChooser<ItemT extends Parcelable> extends FloatingLabelTextViewBase<TextView> { private static final String SAVE_STATE_KEY_SELECTED_ITEM = "saveStateSelectedItem"; public interface OnWidgetEventListener<ItemT extends Parcelable> { public void onShowItemChooser(FloatingLabelItemChooser<ItemT> source); } public interface OnItemChooserEventListener<ItemT extends Parcelable> { public void onSelectionChanged(FloatingLabelItemChooser<ItemT> source, ItemT selectedItem); } /** * The selected items indices within the available items */ protected ItemT selectedItem; /** * Something to turn our items into strings */ protected ItemPrinter<ItemT> itemPrinter; /** * The listener to notify when this widget has something to say */ protected OnWidgetEventListener<ItemT> widgetListener; /** * The listener to notify when the selection changes */ protected OnItemChooserEventListener<ItemT> itemChooserListener; // ============================================================================================= // Lifecycle // == public FloatingLabelItemChooser(Context context) { super(context); } public FloatingLabelItemChooser(Context context, AttributeSet attrs) { super(context, attrs); } public FloatingLabelItemChooser(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } // ============================================================================================= // Overridden methods // == @Override protected int getDefaultLayoutId() { return R.layout.flw_widget_floating_label_item_chooser; } @Override protected int getDefaultDrawableRightResId() { return R.drawable.ic_chooser; } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); getInputWidget().setClickable(true); getInputWidget().setOnClickListener(inputWidgetClickListener); } @Override protected void restoreInputWidgetState(Parcelable inputWidgetState) { getInputWidget().onRestoreInstanceState(inputWidgetState); } @Override protected Parcelable saveInputWidgetInstanceState() { return getInputWidget().onSaveInstanceState(); } @Override protected void putAdditionalInstanceState(Bundle saveState) { if (selectedItem != null) { saveState.putParcelable(SAVE_STATE_KEY_SELECTED_ITEM, selectedItem); } } @Override protected void restoreAdditionalInstanceState(Bundle savedState) { selectedItem = savedState.getParcelable(SAVE_STATE_KEY_SELECTED_ITEM); } @Override protected void setInitialWidgetState() { if (selectedItem == null) { setLabelAnchored(true); getInputWidget().setText(""); } else { setLabelAnchored(false); getInputWidget().setText(getItemPrinter().print(getSelectedItem())); } } @Override protected LabelAnimator<TextView> getDefaultLabelAnimator() { return new TextViewLabelAnimator<TextView>(); } // ============================================================================================= // Item choosing // == /** * Set the item currently selected * * @param item The item selected by the user */ public void setSelectedItem(ItemT item) { selectedItem = item; onSelectedItemChanged(); } /** * Get the item currently selected * * @return The item selected by the user */ public ItemT getSelectedItem() { return selectedItem; } /** * Refreshes the widget state when the selection changes */ protected void onSelectedItemChanged() { if (selectedItem == null) { anchorLabel(); getInputWidget().setText(""); } else { getInputWidget().setText(getItemPrinter().print(selectedItem)); floatLabel(); } if (itemChooserListener != null) itemChooserListener.onSelectionChanged(this, selectedItem); } /** * Show the item picker */ protected void requestShowPicker() { if (widgetListener != null) widgetListener.onShowItemChooser(this); } // ============================================================================================= // Other methods // == public OnItemChooserEventListener<ItemT> getItemChooserListener() { return itemChooserListener; } public void setItemChooserListener(OnItemChooserEventListener<ItemT> itemChooserListener) { this.itemChooserListener = itemChooserListener; } public OnWidgetEventListener<ItemT> getWidgetListener() { return widgetListener; } public void setWidgetListener(OnWidgetEventListener<ItemT> widgetListener) { this.widgetListener = widgetListener; } public void setItemPrinter(ItemPrinter<ItemT> itemPrinter) { this.itemPrinter = itemPrinter; } public ItemPrinter<ItemT> getItemPrinter() { if (itemPrinter == null) { itemPrinter = new ItemPrinter.ToStringItemPrinter<ItemT>(); } return itemPrinter; } /** * Listen to click events on the input widget */ OnClickListener inputWidgetClickListener = new OnClickListener() { @Override public void onClick(View v) { requestShowPicker(); } }; }