package io.github.droidkaigi.confsched.activity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.databinding.DataBindingUtil; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.widget.Toast; import org.parceler.Parcels; import java.io.IOException; import java.util.List; import javax.inject.Inject; import io.github.droidkaigi.confsched.R; import io.github.droidkaigi.confsched.api.DroidKaigiClient; import io.github.droidkaigi.confsched.databinding.ActivitySessionFeedbackBinding; import io.github.droidkaigi.confsched.model.Session; import io.github.droidkaigi.confsched.model.SessionFeedback; import retrofit2.Response; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; public class SessionFeedbackActivity extends BaseActivity { private static final String TAG = SessionFeedbackActivity.class.getName(); @Inject DroidKaigiClient client; private ActivitySessionFeedbackBinding binding; private Session session; private Subscription subscription; private static Intent createIntent(@NonNull Context context, @NonNull Session session) { Intent intent = new Intent(context, SessionFeedbackActivity.class); intent.putExtra(Session.class.getSimpleName(), Parcels.wrap(session)); return intent; } public static void start(Context context, Session session) { Intent intent = createIntent(context, session); context.startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_session_feedback); getComponent().inject(this); session = Parcels.unwrap(getIntent().getParcelableExtra(Session.class.getSimpleName())); initToolbar(session.title); binding.submitFeedbackButton.setOnClickListener(this::onSubmitFeedbackButton); } private void onSubmitFeedbackButton(View view) { if (subscription != null) { subscription.unsubscribe(); } final int relevancy = binding.relevantFeedbackBar.getProgress(); final int asExpected = binding.asExpectedFeedbackBar.getProgress(); final int difficulty = binding.difficultyFeedbackBar.getProgress(); final int knowledgeable = binding.knowledgeableFeedbackBar.getProgress(); final String comment = binding.otherCommentsFeedbackText.getText().toString().trim(); final SessionFeedback feedback = new SessionFeedback(session.id, session.title, relevancy, asExpected, difficulty, knowledgeable, comment); subscription = client.submitSessionFeedback(feedback) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::onSubmitFeedbackSuccess, this::onSubmitFeedbackFailure); } private void onSubmitFeedbackSuccess(Response<Void> response) { if (response.isSuccessful()) { final List<String> pathSegments = response.raw().request().url().pathSegments(); if (!pathSegments.isEmpty() && "closedform".equals(pathSegments.get(pathSegments.size() - 1))) { showDialog(R.string.session_feedback_submit_failure, R.string.session_feedback_not_accepting, (dialog, which) -> dialog.dismiss()); } else { Log.i(TAG, "Successfully sent a session feedback for [" + session.id + "]"); showDialog(R.string.session_feedback_submit_success, R.string.session_feedback_accepted_successfully, (dialog, which) -> { dialog.dismiss(); setResult(RESULT_OK); finish(); }); } } else { showDialog(R.string.session_feedback_submit_failure, R.string.session_feedback_submit_error, (dialog, which) -> dialog.dismiss()); try { final String err = response.errorBody().string(); final IOException e = new IOException("Failed to POST feedback: " + response.code()); Log.e(TAG, "Failed to send the session feedback: [" + err + "]", e); } catch (IOException e) { Log.e(TAG, "Failed to parse the error [" + response.code() + "]: " + e.getMessage(), e); } } } private void showDialog(int titleId, int messageId, DialogInterface.OnClickListener okCallback) { new AlertDialog.Builder(this) .setTitle(titleId) .setMessage(messageId) .setPositiveButton(R.string.ok, okCallback) .show(); } private void onSubmitFeedbackFailure(Throwable throwable) { Toast.makeText(SessionFeedbackActivity.this, R.string.session_feedback_submit_error, Toast.LENGTH_LONG).show(); Log.e(TAG, "Failed to send the session feedback: " + throwable.getMessage(), throwable); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { onBackPressed(); } return super.onOptionsItemSelected(item); } @Override protected void onDestroy() { super.onDestroy(); if (subscription != null) { subscription.unsubscribe(); } } private void initToolbar(String title) { setSupportActionBar(binding.toolbar); ActionBar bar = getSupportActionBar(); if (bar != null) { bar.setDisplayHomeAsUpEnabled(true); bar.setDisplayShowHomeEnabled(true); bar.setDisplayShowTitleEnabled(false); bar.setHomeButtonEnabled(true); } binding.toolbar.setTitle(title); } }