package com.lateensoft.pathfinder.toolkit.views.picker; import android.app.*; import android.content.Intent; import android.os.Bundle; import android.support.v13.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.util.SparseArray; import android.view.*; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ListAdapter; import com.google.common.collect.Lists; import com.lateensoft.pathfinder.toolkit.R; import com.lateensoft.pathfinder.toolkit.model.IdNamePair; import com.lateensoft.pathfinder.toolkit.util.InputMethodUtils; import roboguice.activity.RoboFragmentActivity; import java.util.ArrayList; import java.util.List; /** * @author tsiemens */ public class PickerActivity extends RoboFragmentActivity { private static final String TAG = PickerActivity.class.getSimpleName(); public static final String PICKER_LISTS_KEY = "picker_lists"; public static final String TITLE_KEY = "title"; public static final String IS_SINGLE_CHOICE_KEY = "is_single_choice"; private List<PickerList> m_pickerLists; private ListTypeAdapter m_fragmentAdapter; private ViewPager m_viewPager; private EditText m_searchEditText; private boolean m_isSingleChoice; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_picker); ActionBar actionBar = getActionBar(); Intent intent = getIntent(); String title = intent.getStringExtra(TITLE_KEY); if (title != null) { setTitle(title); } m_isSingleChoice = intent.getBooleanExtra(IS_SINGLE_CHOICE_KEY, false); List<PickerList> lists = intent.getParcelableArrayListExtra(PICKER_LISTS_KEY); if (lists == null || actionBar == null) { finish(); return; } m_pickerLists = lists; actionBar.setDisplayHomeAsUpEnabled(true); m_fragmentAdapter = new ListTypeAdapter(getFragmentManager()); m_viewPager = (ViewPager)findViewById(R.id.view_pager); m_viewPager.setAdapter(m_fragmentAdapter); if (lists.size() > 1) { actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); ActionBar.TabListener tabListener = new ActionBar.TabListener() { @Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { m_viewPager.setCurrentItem(tab.getPosition(), true); } @Override public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {} @Override public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {} }; for (PickerList list : lists) { actionBar.addTab( actionBar.newTab() .setText(list.getName()) .setTabListener(tabListener) ); } m_viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { getActionBar().setSelectedNavigationItem(position); refreshFragment(position); } }); } } private void refreshFragment(int position) { ArrayListFragment fragment = m_fragmentAdapter.getFragment(position); if (fragment != null) { ListAdapter adapter = fragment.getListAdapter(); if (m_searchEditText != null && adapter != null) { Editable editable = m_searchEditText.getText(); if (editable != null) { String searchText = editable.toString(); ((PickerListAdapter) adapter).getFilter().filter(searchText == null ? "" : searchText); } } } else { Log.e(TAG, "Error: no fragment found onPageSelected: " + position); } } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.picker_menu, menu); MenuItem menuItem = menu.findItem(R.id.mi_search); ViewGroup actionView = (ViewGroup) menuItem.getActionView(); if (actionView!= null) { m_searchEditText = (EditText) actionView.findViewById(R.id.et_search); m_searchEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { refreshFragment(m_viewPager.getCurrentItem()); } @Override public void afterTextChanged(Editable s) {} }); menuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { m_searchEditText.requestFocusFromTouch(); InputMethodUtils.showSoftKeyboard(PickerActivity.this); return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { m_searchEditText.setText(null); InputMethodUtils.hideSoftKeyboard(PickerActivity.this); return true; } }); } else { Log.e(TAG, "Error: No action view found for mi_search"); } return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.mi_done) { Intent resultData = new Intent(); for (PickerList pickerList : m_pickerLists) { resultData.putParcelableArrayListExtra(pickerList.getKey(), getCopyOfSelectedItems(pickerList)); } setResult(RESULT_OK, resultData); finish(); } else if (item.getItemId() == R.id.mi_cancel || item.getItemId() == android.R.id.home) { setResult(RESULT_CANCELED); finish(); } else { return super.onOptionsItemSelected(item); } return true; } private ArrayList<IdNamePair> getCopyOfSelectedItems(PickerList pickerList) { ArrayList<IdNamePair> selectedItems = Lists.newArrayList(); for (SelectablePair pair : pickerList) { if (pair.isSelected()) { selectedItems.add(new IdNamePair(pair)); } } return selectedItems; } private class ListTypeAdapter extends FragmentPagerAdapter { SparseArray<ArrayListFragment> m_fragments =new SparseArray<ArrayListFragment>(m_pickerLists.size()); public ListTypeAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return m_pickerLists.size(); } @Override public Fragment getItem(int position) { ArrayListFragment newFragment = newArrayListFragmentInstance(position); m_fragments.put(position, newFragment); return newFragment; } @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); m_fragments.put(position, null); } public ArrayListFragment getFragment(int position) { return m_fragments.get(position); } } private static final String PICKER_LIST_INDEX_KEY = "list_index"; private ArrayListFragment newArrayListFragmentInstance(int pickerListIndex) { ArrayListFragment f = new ArrayListFragment(); Bundle args = new Bundle(); args.putInt(PICKER_LIST_INDEX_KEY, pickerListIndex); f.setArguments(args); return f; } private class ArrayListFragment extends ListFragment { private PickerList pickerList; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { pickerList = m_pickerLists.get(getArguments().getInt(PICKER_LIST_INDEX_KEY)); } else { throw new IllegalArgumentException(PICKER_LIST_INDEX_KEY + " arg was invalid"); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_list, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.d(TAG, "Fragment created"); getListView().setTextFilterEnabled(true); setListAdapter(new PickerListAdapter(getActivity(), pickerList, new PickerListAdapter.OnPairSelectionChangedListener() { @Override public void onSelectionChanged(ArrayAdapter adapter, SelectablePair pair, boolean isSelected) { if (m_isSingleChoice && isSelected) { for (PickerList list : m_pickerLists) { for (SelectablePair p : list) { if (p != pair) { p.setSelected(false); } } } adapter.notifyDataSetChanged(); } } })); } } }