package com.quran.labs.androidquran.ui.util; import android.content.Context; import android.content.res.Resources; import android.support.annotation.NonNull; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.TextView; import com.quran.labs.androidquran.R; import com.quran.labs.androidquran.common.LocalTranslation; import com.quran.labs.androidquran.ui.PagerActivity; import java.util.ArrayList; import java.util.List; import java.util.Set; public class TranslationsSpinnerAdapter extends ArrayAdapter<String> { private Context context; private final LayoutInflater layoutInflater; private String[] translationNames; private List<LocalTranslation> translations; private Set<String> selectedItems; private OnSelectionChangedListener listener; public TranslationsSpinnerAdapter(Context context, int resource, String[] translationNames, List<LocalTranslation> translations, Set<String> selectedItems, OnSelectionChangedListener listener) { // intentionally making a new ArrayList instead of using the constructor for String[]. // this is because clear() relies on being able to clear the List passed into the constructor, // and the String[] constructor makes a new (immutable) List with the items of the array. super(context, resource, new ArrayList<>()); this.context = context; this.layoutInflater = LayoutInflater.from(this.context); translationNames = updateTranslationNames(translationNames); this.translationNames = translationNames; this.translations = translations; this.selectedItems = selectedItems; this.listener = listener; addAll(translationNames); } private View.OnClickListener onCheckedChangeListener = buttonView -> { CheckBoxHolder holder = (CheckBoxHolder) ((View) buttonView.getParent()).getTag(); LocalTranslation localTranslation = translations.get(holder.position); boolean updated = true; if (selectedItems.contains(localTranslation.filename)) { if (selectedItems.size() > 1) { selectedItems.remove(localTranslation.filename); } else { updated = false; holder.checkBox.setChecked(true); } } else { selectedItems.add(localTranslation.filename); } if (updated && listener != null) { listener.onSelectionChanged(selectedItems); } }; private View.OnClickListener onTextClickedListener = textView -> { CheckBoxHolder holder = (CheckBoxHolder) ((View) textView.getParent()).getTag(); if (holder.position == translationNames.length - 1) { if (this.context instanceof PagerActivity) { final PagerActivity pagerActivity = (PagerActivity) this.context; pagerActivity.startTranslationManager(); } } else { holder.checkBox.performClick(); } }; @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { SpinnerHolder holder; if (convertView == null) { holder = new SpinnerHolder(); convertView = layoutInflater.inflate(R.layout.translation_ab_spinner_selected, parent, false); holder.title = (TextView) convertView.findViewById(R.id.title); holder.subtitle = (TextView) convertView.findViewById(R.id.subtitle); convertView.setTag(holder); } holder = (SpinnerHolder) convertView.getTag(); holder.title.setText(R.string.translations); holder.subtitle.setVisibility(View.GONE); return convertView; } @Override public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { CheckBoxHolder holder; if (convertView == null) { convertView = layoutInflater.inflate( R.layout.translation_ab_spinner_item, parent, false); convertView.setTag(new CheckBoxHolder(convertView)); } holder = (CheckBoxHolder) convertView.getTag(); holder.position = position; holder.textView.setOnClickListener(onTextClickedListener); if (position == translationNames.length - 1) { holder.checkBox.setVisibility(View.GONE); holder.checkBox.setOnClickListener(null); Resources r = convertView.getResources(); float leftPadding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, r.getDisplayMetrics()); holder.textView.setPadding(Math.round(leftPadding), 0, 0, 0); holder.textView.setText(R.string.more_translations); } else { holder.checkBox.setVisibility(View.VISIBLE); holder.checkBox.setChecked(selectedItems.contains(translations.get(position).filename)); holder.checkBox.setOnClickListener(onCheckedChangeListener); holder.textView.setText(translationNames[position]); } return convertView; } public int getItemViewType(int position) { if (position == translationNames.length - 1) { return 1; // Last item in spinner should be text "More Translations" } else { return 0; } } public void updateItems(String[] translationNames, List<LocalTranslation> translations, Set<String> selectedItems) { clear(); translationNames = updateTranslationNames(translationNames); this.translationNames = translationNames; this.translations = translations; this.selectedItems = selectedItems; addAll(translationNames); notifyDataSetChanged(); } private static class CheckBoxHolder { final CheckBox checkBox; final TextView textView; int position; CheckBoxHolder(View view) { this.checkBox = (CheckBox) view.findViewById(R.id.checkbox); this.textView = (TextView) view.findViewById(R.id.text); } } protected static class SpinnerHolder { public TextView title; public TextView subtitle; } public interface OnSelectionChangedListener { void onSelectionChanged(Set<String> selectedItems); } private String[] updateTranslationNames(String[] translationNames) { List<String> translationsList = new ArrayList<>(); for (String translation : translationNames) { translationsList.add(translation); } translationsList.add(getContext().getString(R.string.more_translations)); translationNames = translationsList.toArray(new String[translationsList.size()]); return translationNames; } }