package org.gdg.frisbee.android.chapter;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatDialogFragment;
import android.support.v7.widget.SearchView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.ListView;
import android.widget.Toast;
import org.gdg.frisbee.android.R;
import org.gdg.frisbee.android.api.model.Chapter;
import org.gdg.frisbee.android.api.model.Directory;
import org.gdg.frisbee.android.app.App;
import org.gdg.frisbee.android.cache.ModelCache;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
public class ChapterSelectDialog extends AppCompatDialogFragment
implements AdapterView.OnItemClickListener {
private static final String EXTRA_SELECTED_CHAPTER = "EXTRA_SELECTED_CHAPTER";
@BindView(R.id.filter) SearchView cityNameSearchView;
@BindView(android.R.id.list) ListView listView;
private List<Chapter> chapters;
private Listener listener = Listener.EMPTY;
@Nullable private Chapter selectedChapter;
public static ChapterSelectDialog newInstance(@Nullable Chapter selectedChapter) {
ChapterSelectDialog fragment = new ChapterSelectDialog();
Bundle args = new Bundle();
args.putParcelable(EXTRA_SELECTED_CHAPTER, selectedChapter);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
selectedChapter = getArguments().getParcelable(EXTRA_SELECTED_CHAPTER);
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
View view = getActivity().getLayoutInflater()
.inflate(R.layout.view_location_list_preference, (ViewGroup) getView(), false);
ButterKnife.bind(this, view);
return new AlertDialog.Builder(getActivity())
.setNegativeButton(android.R.string.cancel, null)
.setView(view)
.create();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
App.from(getContext()).getModelCache().getAsync(ModelCache.KEY_CHAPTER_LIST_HUB, false,
new ModelCache.CacheListener() {
@Override
public void onGet(Object item) {
chapters = ((Directory) item).getGroups();
setupUI();
}
@Override
public void onNotFound(String key) {
// TODO load from the network.
Toast.makeText(getContext(), R.string.fetch_chapters_failed, Toast.LENGTH_SHORT).show();
dismiss();
}
});
}
private void setupUI() {
listView.setOnItemClickListener(this);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
final CheckedItemAdapter adapter = new CheckedItemAdapter(
getContext(),
android.R.layout.simple_list_item_single_choice,
android.R.id.text1,
chapters
);
listView.setAdapter(adapter);
if (selectedChapter != null) {
int selectedItemPos = chapters.indexOf(selectedChapter);
listView.setSelection(selectedItemPos);
listView.setItemChecked(selectedItemPos, true);
}
final Filter.FilterListener filterListener = new Filter.FilterListener() {
@Override
public void onFilterComplete(int count) {
int index = findIndexByValueInFilteredListView(selectedChapter);
listView.setItemChecked(index, true);
}
};
cityNameSearchView.setOnQueryTextListener(
new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText, filterListener);
return true;
}
}
);
cityNameSearchView.requestFocus();
adapter.getFilter().filter(cityNameSearchView.getQuery(), filterListener);
}
private int findIndexByValueInFilteredListView(@Nullable Chapter value) {
if (value == null || listView == null) {
return -1;
}
Adapter adapter = listView.getAdapter();
for (int i = adapter.getCount() - 1; i >= 0; i--) {
Chapter item = (Chapter) adapter.getItem(i);
if (item.equals(value)) {
return i;
}
}
return -1;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof Listener) {
listener = (Listener) context;
}
}
@Override
public void onDetach() {
listener = Listener.EMPTY;
super.onDetach();
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (getDialog().isShowing()) {
selectedChapter = (Chapter) parent.getItemAtPosition(position);
listener.onChapterSelected(selectedChapter);
getDialog().dismiss();
}
}
private static class CheckedItemAdapter extends ArrayAdapter<Chapter> {
CheckedItemAdapter(Context context, int resource, int textViewResourceId,
List<Chapter> objects) {
super(context, resource, textViewResourceId, objects);
}
@Override
public boolean hasStableIds() {
return true;
}
}
public interface Listener {
void onChapterSelected(Chapter selectedChapter);
Listener EMPTY = new Listener() {
@Override
public void onChapterSelected(Chapter selectedChapter) {
// no-op
}
};
}
}