package com.uservoice.uservoicesdk.ui;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.uservoice.uservoicesdk.R;
import com.uservoice.uservoicesdk.Session;
import com.uservoice.uservoicesdk.babayaga.Babayaga;
import com.uservoice.uservoicesdk.babayaga.Babayaga.Event;
import com.uservoice.uservoicesdk.model.CustomField;
import com.uservoice.uservoicesdk.model.Ticket;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ContactAdapter extends InstantAnswersAdapter {
private int CUSTOM_TEXT_FIELD = 8;
private int CUSTOM_PREDEFINED_FIELD = 9;
private Map<String, String> customFieldValues;
public ContactAdapter(FragmentActivity context) {
super(context);
customFieldValues = new HashMap<String, String>(Session.getInstance().getConfig().getCustomFields());
continueButtonMessage = R.string.uv_contact_continue_button;
}
@Override
public int getViewTypeCount() {
return super.getViewTypeCount() + 2;
}
@Override
protected List<Integer> getDetailRows() {
List<Integer> rows = new ArrayList<Integer>();
rows.addAll(Arrays.asList(EMAIL_FIELD, NAME_FIELD, SPACE));
for (CustomField customField : Session.getInstance().getClientConfig().getCustomFields()) {
if (customField.isPredefined())
rows.add(CUSTOM_PREDEFINED_FIELD);
else
rows.add(CUSTOM_TEXT_FIELD);
}
return rows;
}
@Override
public Object getItem(int position) {
int type = getItemViewType(position);
if (type == CUSTOM_PREDEFINED_FIELD || type == CUSTOM_TEXT_FIELD) {
List<Integer> rows = getRows();
int offset = Math.min(rows.contains(CUSTOM_PREDEFINED_FIELD) ? rows.indexOf(CUSTOM_PREDEFINED_FIELD) : rows.size(), rows.contains(CUSTOM_TEXT_FIELD) ? rows.indexOf(CUSTOM_TEXT_FIELD) : rows.size());
return Session.getInstance().getClientConfig().getCustomFields().get(position - offset);
} else {
return super.getItem(position);
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
int type = getItemViewType(position);
if (view == null) {
if (type == CUSTOM_TEXT_FIELD) {
view = inflater.inflate(R.layout.uv_text_field_item, null);
} else if (type == CUSTOM_PREDEFINED_FIELD) {
view = inflater.inflate(R.layout.uv_select_field_item, null);
} else {
return super.getView(position, convertView, parent);
}
}
if (type == CUSTOM_TEXT_FIELD) {
TextView title = (TextView) view.findViewById(R.id.uv_header_text);
final EditText field = (EditText) view.findViewById(R.id.uv_text_field);
final CustomField customField = (CustomField) getItem(position);
String value = customFieldValues.get(customField.getName());
title.setText(customField.getName());
field.setHint(R.string.uv_value);
field.setInputType(EditorInfo.TYPE_TEXT_VARIATION_SHORT_MESSAGE);
field.setText(value);
field.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
customFieldValues.put(customField.getName(), field.getText().toString());
}
}
});
} else if (type == CUSTOM_PREDEFINED_FIELD) {
final CustomField customField = (CustomField) getItem(position);
String value = customFieldValues.get(customField.getName());
TextView title = (TextView) view.findViewById(R.id.uv_header_text);
title.setText(customField.getName());
Spinner field = (Spinner) view.findViewById(R.id.uv_select_field);
field.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
customFieldValues.put(customField.getName(), position == 0 ? null : customField.getPredefinedValues().get(position - 1));
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
field.setAdapter(new SpinnerAdapter<String>(context, customField.getPredefinedValues()));
if (value != null && customField.getPredefinedValues().contains(value))
field.setSelection(customField.getPredefinedValues().indexOf(value));
} else {
return super.getView(position, view, parent);
}
return view;
}
private boolean validateCustomFields() {
for (CustomField field : Session.getInstance().getClientConfig().getCustomFields()) {
if (field.isRequired()) {
String string = customFieldValues.get(field.getName());
if (string == null || string.isEmpty())
return false;
}
}
return true;
}
@Override
protected void doSubmit() {
if (validateCustomFields()) {
Ticket.createTicket(textField.getText().toString(), emailField.getText().toString(), nameField.getText().toString(), customFieldValues, new DefaultCallback<Ticket>(context) {
@Override
public void onModel(Ticket model) {
Babayaga.track(Event.SUBMIT_TICKET);
Toast.makeText(context, R.string.uv_msg_ticket_created, Toast.LENGTH_SHORT).show();
context.finish();
}
});
} else {
Toast.makeText(context, R.string.uv_msg_custom_fields_validation, Toast.LENGTH_SHORT).show();
}
}
@Override
protected String getSubmitString() {
return context.getString(R.string.uv_send_message);
}
}