package de.westnordost.streetcomplete.quests.note_discussion; import android.os.Bundle; import android.text.format.DateUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.inject.Inject; import de.westnordost.streetcomplete.Injector; import de.westnordost.streetcomplete.R; import de.westnordost.streetcomplete.data.osmnotes.OsmNoteQuestDao; import de.westnordost.streetcomplete.quests.AbstractQuestFormAnswerFragment; import de.westnordost.streetcomplete.util.InlineAsyncTask; import de.westnordost.osmapi.notes.Note; import de.westnordost.osmapi.notes.NoteComment; import static android.text.format.DateUtils.MINUTE_IN_MILLIS; public class NoteDiscussionForm extends AbstractQuestFormAnswerFragment { private static final String TAG = "NoteDiscussionForm"; public static final String TEXT = "text"; @Inject OsmNoteQuestDao noteDb; private EditText noteInput; private LinearLayout noteDiscussion; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Injector.instance.getApplicationComponent().inject(this); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = super.onCreateView(inflater, container, savedInstanceState); setTitle(R.string.quest_noteDiscussion_title); View contentView = setContentView(R.layout.quest_note_discussion); noteInput = (EditText) contentView.findViewById(R.id.noteInput); noteDiscussion = (LinearLayout) contentView.findViewById(R.id.noteDiscussion); new InlineAsyncTask<Note>() { @Override protected Note doInBackground() throws Exception { return noteDb.get(getQuestId()).getNote(); } @Override public void onSuccess(Note result) { if(getActivity() != null) { inflateNoteDiscussion(result); } } @Override public void onError(Exception e) { Log.e(TAG, "Error fetching note quest " + getQuestId() + " from DB.", e); } }.execute(); return view; } private void inflateNoteDiscussion(Note note) { for(NoteComment noteComment : note.comments) { CharSequence userName; if (noteComment.isAnonymous()) { userName = getResources().getString(R.string.quest_noteDiscussion_anonymous); } else { userName = noteComment.user.displayName; } CharSequence dateDescription = DateUtils.getRelativeTimeSpanString( noteComment.date.getTime(), new Date().getTime(), MINUTE_IN_MILLIS); CharSequence commenter = String.format( getResources().getString(getNoteCommentActionResourceId(noteComment.action)), userName, dateDescription); if(noteComment == note.comments.get(0)) { TextView noteText = (TextView) getView().findViewById(R.id.noteText); noteText.setText(noteComment.text); TextView noteAuthor = (TextView) getView().findViewById(R.id.noteAuthor); noteAuthor.setText(commenter); } else { ViewGroup discussionItem = (ViewGroup) LayoutInflater.from(getActivity()).inflate( R.layout.quest_note_discussion_item, noteDiscussion, false); TextView commentInfo = (TextView) discussionItem.findViewById(R.id.comment_info); commentInfo.setText(commenter); TextView commentText = (TextView) discussionItem.findViewById(R.id.comment_text); commentText.setText(noteComment.text); noteDiscussion.addView(discussionItem); } } } private int getNoteCommentActionResourceId(NoteComment.Action action) { switch (action) { case OPENED: return R.string.quest_noteDiscussion_create; case COMMENTED: return R.string.quest_noteDiscussion_comment; case CLOSED: return R.string.quest_noteDiscussion_closed; case REOPENED: return R.string.quest_noteDiscussion_reopen; } throw new RuntimeException(); } @Override protected void onClickOk() { String noteText = noteInput.getText().toString().trim(); if(noteText.isEmpty()) { noteInput.setError(getResources().getString(R.string.quest_generic_error_field_empty)); return; } Bundle answer = new Bundle(); answer.putString(TEXT, noteText); applyFormAnswer(answer); } @Override protected List<Integer> getOtherAnswerResourceIds() { List<Integer> answers = new ArrayList<>(); answers.add(R.string.quest_noteDiscussion_no); return answers; } @Override protected boolean onClickOtherAnswer(int itemResourceId) { if(itemResourceId == R.string.quest_noteDiscussion_no) { skipQuest(); return true; } return false; } @Override public boolean hasChanges() { return !noteInput.getText().toString().trim().isEmpty(); } }