package com.boardgamegeek.ui.dialog; import android.app.Dialog; import android.os.Bundle; import android.os.Handler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.DialogFragment; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; import android.widget.ScrollView; import com.boardgamegeek.R; import com.boardgamegeek.sorter.CollectionSorter; import com.boardgamegeek.sorter.CollectionSorterFactory; import com.boardgamegeek.util.PreferencesUtils; import com.boardgamegeek.util.StringUtils; import java.util.List; import butterknife.BindView; import butterknife.BindViews; import butterknife.ButterKnife; import butterknife.Unbinder; import hugo.weaving.DebugLog; import timber.log.Timber; public class CollectionSortDialogFragment extends DialogFragment implements OnCheckedChangeListener { public interface Listener { void onSortSelected(int sortType); } private Unbinder unbinder; private ViewGroup root; private Listener listener; private int selectedType; @BindView(R.id.scroll_container) ScrollView scrollContainer; @BindView(R.id.radio_group) RadioGroup radioGroup; @BindViews({ R.id.name, R.id.rank, R.id.geek_rating, R.id.average_rating, R.id.my_rating, R.id.last_viewed, R.id.wishlist_priority, R.id.play_count_asc, R.id.play_count_desc, R.id.play_date, R.id.year_published_asc, R.id.year_published_desc, R.id.play_time_asc, R.id.play_time_desc, R.id.suggested_age_asc, R.id.suggested_age_desc, R.id.average_weight_asc, R.id.average_weight_desc, R.id.acquisition_date, R.id.acquired_from, R.id.price_paid, R.id.current_value }) List<RadioButton> radioButtons; @BindView(R.id.play_date) View playDateRadioButton; @BindView(R.id.play_date_message) View playDateMessageView; @DebugLog public CollectionSortDialogFragment() { } @DebugLog public static CollectionSortDialogFragment newInstance(@Nullable ViewGroup root, @Nullable Listener listener) { final CollectionSortDialogFragment fragment = new CollectionSortDialogFragment(); fragment.initialize(root, listener); return fragment; } @DebugLog private void initialize(@Nullable ViewGroup root, @Nullable Listener listener) { this.root = root; this.listener = listener; } @DebugLog @Override @NonNull public Dialog onCreateDialog(Bundle savedInstanceState) { LayoutInflater layoutInflater = LayoutInflater.from(getActivity()); View rootView = layoutInflater.inflate(R.layout.dialog_collection_sort, root, false); unbinder = ButterKnife.bind(this, rootView); if (!PreferencesUtils.getSyncPlays(getContext())) { if (findSelectedRadioButton() != playDateRadioButton) { playDateRadioButton.setVisibility(View.GONE); playDateMessageView.setVisibility(View.GONE); } } setChecked(); radioGroup.setOnCheckedChangeListener(this); createNames(); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()).setView(rootView); builder.setTitle(R.string.title_sort); return builder.create(); } @Override public void onDestroyView() { super.onDestroyView(); if (unbinder != null) unbinder.unbind(); } @DebugLog private void createNames() { CollectionSorterFactory factory = new CollectionSorterFactory(getActivity()); for (RadioButton radioButton : radioButtons) { int sortType = getTypeFromView(radioButton); CollectionSorter sorter = factory.create(sortType); radioButton.setText(sorter.getDescription()); } } @DebugLog @Override public void onCheckedChanged(RadioGroup group, int checkedId) { int sortType = getTypeFromView(group.findViewById(checkedId)); Timber.d("Sort by %s", sortType); if (listener != null) { listener.onSortSelected(sortType); } dismiss(); } @DebugLog public void setSelection(int type) { selectedType = type; setChecked(); } @DebugLog private void setChecked() { RadioButton radioButton = findSelectedRadioButton(); if (radioButton != null) { checkRadioButton(radioButton); focusRadioButton(radioButton); } } @DebugLog private RadioButton findSelectedRadioButton() { if (radioButtons != null) { for (RadioButton radioButton : radioButtons) { int type = getTypeFromView(radioButton); if (type == selectedType) { return radioButton; } } } return null; } @DebugLog private void checkRadioButton(RadioButton radioButton) { radioGroup.setOnCheckedChangeListener(null); radioButton.setChecked(true); radioGroup.setOnCheckedChangeListener(this); } @DebugLog private void focusRadioButton(final RadioButton radioButton) { new Handler().post(new Runnable() { @Override public void run() { if (scrollContainer == null) return; scrollContainer.scrollTo(0, (int) radioButton.getY()); } }); } @DebugLog private int getTypeFromView(View view) { return StringUtils.parseInt(view.getTag().toString(), CollectionSorterFactory.TYPE_UNKNOWN); } }