package org.wheelmap.android.tango; import android.animation.LayoutTransition; import android.content.Context; import android.databinding.DataBindingUtil; import android.os.Build; import android.support.annotation.DrawableRes; import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import com.google.auto.value.AutoValue; import org.wheelmap.android.online.R; import org.wheelmap.android.online.databinding.TangoModeSelectionItemBinding; import org.wheelmap.android.online.databinding.TangoModeSelectionViewBinding; import java.util.ArrayList; import java.util.List; public class ModeSelectionView extends LinearLayout { public interface OnItemSelectedListener { void onItemSelected(Item item); } private TangoModeSelectionViewBinding binding; private Item selectedItem = null; private List<Item> items = new ArrayList<>(); private OnItemSelectedListener listener; public ModeSelectionView(Context context) { super(context); init(); } public ModeSelectionView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ModeSelectionView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { binding = DataBindingUtil.inflate( LayoutInflater.from(getContext()), R.layout.tango_mode_selection_view, this, true ); LayoutTransition transition = new LayoutTransition(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { transition.enableTransitionType(LayoutTransition.APPEARING); transition.enableTransitionType(LayoutTransition.DISAPPEARING); transition.enableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); transition.enableTransitionType(LayoutTransition.CHANGE_APPEARING); transition.enableTransitionType(LayoutTransition.CHANGING); } ((ViewGroup) binding.getRoot()).setLayoutTransition(transition); binding.choosableContent.getLayoutParams().height = 0; binding.top.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { ModeSelectionView.this.toggleMenu(); } }); } private void toggleMenu() { openMenu(binding.choosableContent.getLayoutParams().height == 0); } public void openMenu(boolean open) { int rotation = 0; if (!open) { rotation = 0; binding.choosableContent.getLayoutParams().height = 0; } else { rotation = 180; binding.choosableContent.getLayoutParams().height = LayoutParams.WRAP_CONTENT; } binding.choosableContent.setLayoutParams(binding.choosableContent.getLayoutParams()); binding.expandButton.animate().rotation(rotation).start(); } public void setItems(List<Item> items) { this.items = items; binding.choosableContent.removeAllViews(); LayoutInflater inflater = LayoutInflater.from(getContext()); for (final Item item : items) { if (item == selectedItem) { continue; } TangoModeSelectionItemBinding itemBinding = DataBindingUtil.inflate(inflater, R.layout.tango_mode_selection_item, binding.choosableContent, true); if (item.drawable() != 0) { itemBinding.icon.setImageResource(item.drawable()); } itemBinding.title.setText(item.title()); itemBinding.getRoot().setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { ModeSelectionView.this.setSelectedItem(item); if (listener != null) { listener.onItemSelected(item); } } }); } } public void setSelectedItemTag(Object tag) { if (tag == null) { return; } List<Item> items1 = this.items; for (int i = 0; i < items1.size(); i++) { Item item = items1.get(i); if (tag.equals(item.tag())) { setSelectedItem(item); return; } } } public void setSelectedItem(Item item) { int selectedItemIndex = -1; List<Item> items1 = this.items; for (int i = 0; i < items1.size(); i++) { Item item1 = items1.get(i); if (item1.equals(item)) { selectedItemIndex = i; break; } } selectedItem = items.get(selectedItemIndex); if (item.drawable() != 0) { binding.selectedItem.icon.setImageResource(item.drawable()); } binding.selectedItem.title.setText(item.title()); openMenu(false); setItems(items); } public Item getSelectedItem() { return selectedItem; } public void setOnItemSelectionListener(OnItemSelectedListener listener) { this.listener = listener; } @AutoValue public abstract static class Item { @StringRes abstract int title(); @DrawableRes abstract int drawable(); /** * used to identify this item */ @Nullable abstract Object tag(); public static Item create(@StringRes int title, @DrawableRes int drawable, Object tag) { return new AutoValue_ModeSelectionView_Item(title, drawable, tag); } } }