package de.westnordost.streetcomplete.quests.opening_hours; import android.content.DialogInterface; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import de.westnordost.streetcomplete.Injector; import de.westnordost.streetcomplete.R; import de.westnordost.streetcomplete.data.meta.CurrentCountry; import de.westnordost.streetcomplete.quests.AbstractQuestAnswerFragment; import de.westnordost.osmapi.map.data.OsmElement; import de.westnordost.streetcomplete.quests.AbstractQuestFormAnswerFragment; import de.westnordost.streetcomplete.util.Serializer; import de.westnordost.streetcomplete.view.dialogs.AlertDialogBuilder; import static android.view.Menu.NONE; public class AddOpeningHoursForm extends AbstractQuestFormAnswerFragment { public static final String OPENING_HOURS = "opening_hours"; private static final String OPENING_HOURS_DATA = "oh_data", IS_ADD_MONTHS_MODE = "oh_add_months"; private boolean isAlsoAddingMonths; private AddOpeningHoursAdapter openingHoursAdapter; @Inject Serializer serializer; @Inject CurrentCountry currentCountry; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = super.onCreateView(inflater, container, savedInstanceState); Injector.instance.getApplicationComponent().inject(this); setTitle(); View contentView = setContentView(R.layout.quest_opening_hours); ArrayList<OpeningMonths> data; if(savedInstanceState != null) { data = serializer.toObject(savedInstanceState.getByteArray(OPENING_HOURS_DATA),ArrayList.class); isAlsoAddingMonths = savedInstanceState.getBoolean(IS_ADD_MONTHS_MODE); } else { data = new ArrayList<>(); data.add(new OpeningMonths()); isAlsoAddingMonths = false; } openingHoursAdapter = new AddOpeningHoursAdapter(data, getActivity(), currentCountry); openingHoursAdapter.setDisplayMonths(isAlsoAddingMonths); RecyclerView openingHoursList = (RecyclerView) contentView.findViewById(R.id.opening_hours_list); openingHoursList.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false)); openingHoursList.setAdapter(openingHoursAdapter); openingHoursList.setNestedScrollingEnabled(false); Button addTimes = (Button) contentView.findViewById(R.id.btn_add); addTimes.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onClickAddButton(v); } }); return view; } private void onClickAddButton(View v) { if(!isAlsoAddingMonths) { openingHoursAdapter.addNewWeekdays(); } else { PopupMenu m = new PopupMenu(getActivity(), v); m.getMenu().add(NONE,0,NONE,R.string.quest_openingHours_add_weekdays); m.getMenu().add(NONE,1,NONE,R.string.quest_openingHours_add_months); m.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { if(0 == item.getItemId()) openingHoursAdapter.addNewWeekdays(); else if(1 == item.getItemId()) openingHoursAdapter.addNewMonths(); return true; } }); m.show(); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putByteArray(OPENING_HOURS_DATA, serializer.toBytes(openingHoursAdapter.getData())); outState.putBoolean(IS_ADD_MONTHS_MODE, isAlsoAddingMonths); } private void setTitle() { OsmElement element = getOsmElement(); String name = null; if(element != null && element.getTags() != null) { name = element.getTags().get("name"); } setTitle(getResources().getString(R.string.quest_openingHours_name_title, name)); } @Override protected List<Integer> getOtherAnswerResourceIds() { List<Integer> answers = super.getOtherAnswerResourceIds(); answers.add(R.string.quest_openingHours_answer_no_regular_opening_hours); answers.add(R.string.quest_openingHours_answer_247); answers.add(R.string.quest_openingHours_answer_seasonal_opening_hours); return answers; } @Override protected boolean onClickOtherAnswer(int itemResourceId) { if(super.onClickOtherAnswer(itemResourceId)) return true; if(itemResourceId == R.string.quest_openingHours_answer_247) { showConfirm24_7Dialog(); return true; } if(itemResourceId == R.string.quest_openingHours_answer_seasonal_opening_hours) { isAlsoAddingMonths = true; openingHoursAdapter.changeToMonthsMode(); return true; } if(itemResourceId == R.string.quest_openingHours_answer_no_regular_opening_hours) { showInputCommentDialog(); return true; } return false; } @Override protected void onClickOk() { applyOpeningHours(openingHoursAdapter.toString()); } private void showInputCommentDialog() { View view = LayoutInflater.from(getActivity()).inflate(R.layout.quest_opening_hours_comment, null); final EditText editText = (EditText)view.findViewById(R.id.commentInput); new AlertDialogBuilder(getActivity()) .setTitle(R.string.quest_openingHours_comment_title) .setView(view) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String txt = editText.getText().toString().replaceAll("\"",""); Bundle answer = new Bundle(); answer.putString(OPENING_HOURS, "\""+txt+"\""); applyImmediateAnswer(answer); } }) .setNegativeButton(android.R.string.cancel, null) .show(); } private void showConfirm24_7Dialog() { new AlertDialogBuilder(getActivity()) .setMessage(R.string.quest_openingHours_24_7_confirmation) .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Bundle answer = new Bundle(); answer.putString(OPENING_HOURS, "24/7"); applyImmediateAnswer(answer); } }) .setNegativeButton(android.R.string.no, null) .show(); } private void applyOpeningHours(String openingHours) { Bundle answer = new Bundle(); answer.putString(OPENING_HOURS, openingHours); applyFormAnswer(answer); } @Override public boolean hasChanges() { return !openingHoursAdapter.toString().isEmpty(); } }