package com.dozuki.ifixit.ui.guide.create;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import com.dozuki.ifixit.App;
import com.dozuki.ifixit.R;
import com.dozuki.ifixit.model.guide.Guide;
import com.dozuki.ifixit.util.api.ApiCall;
import com.dozuki.ifixit.util.api.ApiEvent;
import com.dozuki.ifixit.util.api.Api;
import com.squareup.otto.Subscribe;
import com.dozuki.ifixit.ui.BaseDialogFragment;
import java.util.ArrayList;
import java.util.regex.Pattern;
public class NewGuideDialogFragment extends BaseDialogFragment {
private static final String INVALID_DEVICE_NAME_PATTERN = "[^#<>\\[\\]\\|\\{\\},\\+\\?&\\/\\\\\\%:;]+";
private static final String GUIDE_KEY = "GUIDE_KEY";
private static final String TOPIC_LIST_KEY = "TOPIC_LIST_KEY";
private Guide mGuide;
private Spinner mType;
private EditText mSubject;
private AutoCompleteTextView mTopic;
private TextView mSubjectLabel;
private ArrayList<String> mTopics;
private ArrayAdapter<String> mAdapter;
public static NewGuideDialogFragment newInstance(Guide guide) {
NewGuideDialogFragment frag = new NewGuideDialogFragment();
Bundle bundle = new Bundle();
bundle.putSerializable(GUIDE_KEY, guide);
frag.setArguments(bundle);
frag.setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Dialog);
return frag;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
mGuide = (Guide) savedInstanceState.getSerializable(GUIDE_KEY);
mTopics = (ArrayList<String>) savedInstanceState.getSerializable(TOPIC_LIST_KEY);
} else {
mGuide = (Guide) getArguments().getSerializable(GUIDE_KEY);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
getDialog().setTitle(getString(R.string.new_guide_details_title));
View v = inflater.inflate(R.layout.new_guide_fragment_dialog, container, false);
final String topicName = App.get().getTopicName();
mTopic = (AutoCompleteTextView) v.findViewById(R.id.topic_name_field);
mTopic.setHint(getString(R.string.guide_intro_wizard_guide_topic_hint, topicName));
mTopic.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
@Override
public void afterTextChanged(Editable editable) { }
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (!Pattern.matches(INVALID_DEVICE_NAME_PATTERN, charSequence)) {
mTopic.setError(getString(R.string.device_invalid_characters_error_message));
}
}
});
String topic = mGuide.getTopic();
if (topic != null && topic.length() != 0) {
mTopic.setText(topic);
}
if (mTopics != null) {
setTopicArrayAdapter();
} else {
Api.call(getActivity(), ApiCall.allTopics());
}
mSubject = (EditText) v.findViewById(R.id.subject_field);
mSubject.setHint(getString(R.string.guide_intro_wizard_guide_subject_hint));
String subject = mGuide.getSubject();
if (subject != null && subject.length() != 0) {
mSubject.setText(subject);
}
mSubjectLabel = (TextView) v.findViewById(R.id.subject_label);
mType = (Spinner) v.findViewById(R.id.guide_types_spinner);
// Create an ArrayAdapter using the string array and a default spinner layout
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item,
App.get().getSite().getGuideTypesArray());
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
mType.setAdapter(adapter);
mType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String[] guideTypes = App.get().getSite().getGuideTypesArray();
int visibility;
if (!App.get().getSite().hasSubject(guideTypes[position])) {
visibility = View.GONE;
mTopic.setImeOptions(EditorInfo.IME_ACTION_DONE);
} else {
visibility = View.VISIBLE;
mTopic.setImeOptions(EditorInfo.IME_ACTION_NEXT);
}
mSubject.setVisibility(visibility);
mSubjectLabel.setVisibility(visibility);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// No need to do anything
}
});
String type = mGuide.getType();
if (type != null && type.length() > 0) {
mType.setSelection(adapter.getPosition(type));
}
((TextView) v.findViewById(R.id.topic_name_label)).setText(
getString(R.string.guide_intro_wizard_guide_topic_title, topicName));
v.findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean error = false;
String type = (String) mType.getItemAtPosition(mType.getSelectedItemPosition());
Editable topic = mTopic.getText();
if (App.get().getSite().hasSubject(type)) {
Editable subject = mSubject.getText();
if (subject.length() == 0) {
error = true;
mSubject.setError(getString(R.string.guide_subject_required_error));
} else {
mGuide.setSubject(subject.toString());
}
}
if (topic.length() == 0) {
error = true;
mTopic.setError(getString(R.string.topic_name_required_error, topicName));
}
if (!error) {
mGuide.setType(type);
mGuide.setTopic(topic.toString());
App.getBus().post(new GuideDetailsChangedEvent(mGuide));
getDialog().dismiss();
}
}
});
return v;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Editable topic = mTopic.getText();
if (topic != null)
mGuide.setTopic(topic.toString());
if (mSubject != null) {
Editable subject = mSubject.getText();
if (subject != null) {
mGuide.setSubject(subject.toString());
}
}
outState.putSerializable(GUIDE_KEY, mGuide);
outState.putStringArrayList(TOPIC_LIST_KEY, mTopics);
}
@Subscribe
public void onTopicList(ApiEvent.TopicList event) {
if (!event.hasError()) {
mTopics = new ArrayList<String>(event.getResult());
setTopicArrayAdapter();
} else {
Api.getErrorDialog(getActivity(), event).show();
}
}
private void setTopicArrayAdapter() {
mAdapter = new ArrayAdapter<String>(getActivity(), R.layout.topic_name_autocomplete_dropdown_item,
mTopics);
mTopic.setAdapter(mAdapter);
}
}