package org.edx.mobile.view;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v4.widget.TextViewCompat;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.joanzapata.iconify.Icon;
import com.joanzapata.iconify.IconDrawable;
import com.joanzapata.iconify.fonts.FontAwesomeIcons;
import org.edx.mobile.R;
import org.edx.mobile.user.FormField;
import org.edx.mobile.user.FormOption;
import org.edx.mobile.user.FormOptions;
import org.edx.mobile.user.GetFormOptionsTask;
import org.edx.mobile.util.ResourceUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.edx.mobile.base.BaseFragment;
import roboguice.inject.InjectExtra;
import roboguice.inject.InjectView;
public class FormFieldSelectFragment extends BaseFragment {
@InjectExtra(FormFieldActivity.EXTRA_FIELD)
private FormField formField;
@InjectView(android.R.id.list)
private ListView listView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_form_field_select, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getActivity().setTitle(formField.getLabel());
final List<FormOption> options = new ArrayList<>();
final FormOptions formOptions = formField.getOptions();
final ArrayAdapter<FormOption> adapter = new ArrayAdapter<>(getActivity(), R.layout.edx_selectable_list_item, options);
if (formOptions.getReference() != null) {
new GetFormOptionsTask(getActivity(), formOptions.getReference()) {
@Override
protected void onSuccess(List<FormOption> formOptions) throws Exception {
options.addAll(formOptions);
adapter.notifyDataSetChanged();
selectCurrentOption();
}
}.execute();
} else if (formOptions.getRangeMin() != null && formOptions.getRangeMax() != null) {
for (int i = formOptions.getRangeMax(); i >= formOptions.getRangeMin(); --i) {
options.add(new FormOption(String.valueOf(i), String.valueOf(i)));
}
} else if (formOptions.getValues() != null && formOptions.getValues().size() > 0) {
options.addAll(formOptions.getValues());
}
if (!TextUtils.isEmpty(formField.getInstructions())) {
final View instructionsContainer = LayoutInflater.from(view.getContext()).inflate(R.layout.form_field_instructions_header, listView, false);
final TextView instructions = (TextView) instructionsContainer.findViewById(R.id.instructions);
final TextView subInstructions = (TextView) instructionsContainer.findViewById(R.id.sub_instructions);
instructions.setText(formField.getInstructions());
if (TextUtils.isEmpty(formField.getSubInstructions())) {
subInstructions.setVisibility(View.GONE);
} else {
subInstructions.setText(formField.getSubInstructions());
}
listView.addHeaderView(instructionsContainer, null, false);
}
if (null != formField.getDataType()) {
switch (formField.getDataType()) {
case COUNTRY: {
final Locale locale = Locale.getDefault();
addDetectedValueHeader(listView,
R.string.edit_user_profile_current_location,
"current_location",
locale.getDisplayCountry(),
locale.getCountry(),
FontAwesomeIcons.fa_map_marker);
break;
}
case LANGUAGE: {
final Locale locale = Locale.getDefault();
addDetectedValueHeader(listView,
R.string.edit_user_profile_current_language,
"current_language",
locale.getDisplayLanguage(),
locale.getLanguage(),
FontAwesomeIcons.fa_comment);
break;
}
}
}
if (formField.getOptions().isAllowsNone()) {
final TextView textView = (TextView) LayoutInflater.from(listView.getContext()).inflate(R.layout.edx_selectable_list_item, listView, false);
final String label = formField.getOptions().getNoneLabel();
textView.setText(label);
listView.addHeaderView(textView, new FormOption(label, null), true);
}
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final FormOption item = (FormOption) parent.getItemAtPosition(position);
getActivity().setResult(Activity.RESULT_OK, new Intent()
.putExtra(FormFieldActivity.EXTRA_FIELD, formField)
.putExtra(FormFieldActivity.EXTRA_VALUE, item.getValue()));
getActivity().finish();
}
});
selectCurrentOption();
}
private static void addDetectedValueHeader(@NonNull ListView listView, @StringRes int labelRes, @NonNull String labelKey, @NonNull String labelValue, @NonNull String value, @NonNull Icon icon) {
final TextView textView = (TextView) LayoutInflater.from(listView.getContext()).inflate(R.layout.edx_selectable_list_item, listView, false);
{
final SpannableString labelValueSpan = new SpannableString(labelValue);
labelValueSpan.setSpan(new ForegroundColorSpan(listView.getResources().getColor(R.color.edx_brand_gray_base)), 0, labelValueSpan.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(ResourceUtil.getFormattedString(listView.getContext().getResources(), labelRes, labelKey, labelValueSpan));
}
Context context = textView.getContext();
TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(textView,
new IconDrawable(context, icon)
.sizeRes(context, R.dimen.edx_base)
.colorRes(context, R.color.edx_brand_gray_back)
, null, null, null);
listView.addHeaderView(textView, new FormOption(labelValue, value), true);
}
private void selectCurrentOption() {
final String currentValue = getArguments().getString(FormFieldActivity.EXTRA_VALUE);
if (null != currentValue) {
for (int i = 0; i < listView.getCount(); i++) {
final FormOption option = (FormOption) listView.getItemAtPosition(i);
if (null != option && TextUtils.equals(option.getValue(), currentValue)) {
listView.setItemChecked(i, true);
listView.setSelection(i);
break;
}
}
}
}
}