package org.onebrick.android.activities;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.activeandroid.content.ContentProvider;
import com.squareup.otto.Subscribe;
import org.onebrick.android.R;
import org.onebrick.android.adapters.CardArrayAdapter;
import org.onebrick.android.cards.ContactsCard;
import org.onebrick.android.cards.DescriptionCard;
import org.onebrick.android.cards.MapCard;
import org.onebrick.android.cards.PhotoGalleryCard;
import org.onebrick.android.cards.TitleCard;
import org.onebrick.android.core.OneBrickApplication;
import org.onebrick.android.core.OneBrickRESTClient;
import org.onebrick.android.events.FetchEventDetailEvent;
import org.onebrick.android.events.LoginStatusEvent;
import org.onebrick.android.events.Status;
import org.onebrick.android.helpers.DateTimeFormatter;
import org.onebrick.android.helpers.LoginManager;
import org.onebrick.android.helpers.Utils;
import org.onebrick.android.models.Event;
import org.onebrick.android.models.RSVP;
import butterknife.Bind;
import butterknife.ButterKnife;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
public class EventDetailActivity extends AppCompatActivity implements
LoaderManager.LoaderCallbacks<Cursor> {
private static final String TAG = EventDetailActivity.class.getSimpleName();
public static final String EXTRA_EVENT_ID = "event_id";
public static final String SUCCESS = "0";
private static final String SOCIAL_URL_PREFIX = "http://onebrick.org/event/?eventid=";
private static final int EVENT_DETAIL_LOADER = 77;
@Bind(R.id.lv_event_detail_cards)
ListView mCardsListView;
@Bind(R.id.btn_rsvp)
Button mBtnRsvp;
@Bind(R.id.tvStatusMessage)
TextView mTvStatusMessage;
@Bind(R.id.ll_rsvp_segment)
LinearLayout mLlRsvpSegment;
private CardArrayAdapter mAdapter;
private long mEventId;
private Event mEvent;
private boolean mPendingRsvp;
private TitleCard mTitleCard;
private MapCard mMapCard;
private PhotoGalleryCard mPhotoGalleryCard;
private void updateViews() {
// TODO check current date for past events. if past events, don't show rsvp/unrsvp buttons
if (DateTimeFormatter.getInstance().isPastEvent(mEvent.getEndDate()) || Utils.isEventCancelled(mEvent.getEventStatus())) {
mLlRsvpSegment.setVisibility(View.GONE);
} else if (LoginManager.getInstance(this).isLoggedIn() && mEvent.isRsvp()) {
mBtnRsvp.setText(R.string.un_rsvp);
mBtnRsvp.setBackgroundResource(R.drawable.btn_unrsvp_small);
} else if (!DateTimeFormatter.getInstance().isRSVPOpen(mEvent.getRSVPOpenDate())){
// event will open later
mBtnRsvp.setVisibility(View.GONE);
mTvStatusMessage.setVisibility(View.VISIBLE);
mTvStatusMessage.setText(getResources().getText(R.string.rsvp_not_open) + DateTimeFormatter.getInstance().getFormattedEventDateOnly(mEvent.getRSVPOpenDate()));
} else if (mEvent.getRsvpCount() >= mEvent.getRsvpCapacity()) {
// event is full
mBtnRsvp.setVisibility(View.GONE);
mTvStatusMessage.setVisibility(View.VISIBLE);
mTvStatusMessage.setText(getResources().getText(R.string.event_full));
} else {
mBtnRsvp.setText(R.string.rsvp);
mBtnRsvp.setBackgroundResource(R.drawable.btn_rsvp_small);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
case R.id.mi_item_share:
setShareIntent();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onBackPressed() {
// call onLoaderReset
getLoaderManager().destroyLoader(EVENT_DETAIL_LOADER);
finish();
overridePendingTransition(R.anim.left_in, R.anim.right_out);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate menu resource file.
getMenuInflater().inflate(R.menu.event_detail, menu);
// // Return true to display menu
return true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event_info);
getSupportActionBar().setTitle("Event Details");
ButterKnife.bind(this);
mAdapter = new CardArrayAdapter(this);
mAdapter.setNotifyOnChange(false);
mCardsListView.setAdapter(mAdapter);
Intent eventInfo = getIntent();
mEventId = eventInfo.getLongExtra(EXTRA_EVENT_ID, -1);
if (savedInstanceState == null) {
OneBrickRESTClient.getInstance().requestEventDetail(mEventId);
}
getSupportLoaderManager().initLoader(EVENT_DETAIL_LOADER, null, this);
OneBrickApplication.getInstance().getBus().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
OneBrickApplication.getInstance().getBus().unregister(this);
}
private void setupListeners() {
mBtnRsvp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final LoginManager loginManager = LoginManager.getInstance(EventDetailActivity.this);
final long eventId = mEvent.getEventId();
if (!loginManager.isLoggedIn()) {
mPendingRsvp = true;
// when a user is not logged in yet, redirect a user to login screen
final Intent loginActivity = new Intent(EventDetailActivity.this, LoginActivity.class);
startActivity(loginActivity);
} else {
// already logged in. just get stored ukey
processRsvpRequest(eventId);
}
}
});
}
private void processRsvpRequest(long eventId) {
final LoginManager loginManager = LoginManager.getInstance(this);
final String ukey = loginManager.getCurrentUserKey();
if (!TextUtils.isEmpty(ukey)) {
if (mBtnRsvp.getText().toString().equalsIgnoreCase(getString(R.string.rsvp))) {
processRSVP(ukey, eventId);
} else if (mBtnRsvp.getText().toString().equalsIgnoreCase(getString(R.string.un_rsvp))) {
processUnRSVP(ukey, eventId);
}
}
}
/**
* This is the response handler to handle the callback from RSVP rest request
*
* @param ukey
* @param eventId
*/
private void processRSVP(String ukey, long eventId) {
OneBrickRESTClient.getInstance().rsvp(ukey, eventId, new Callback<RSVP>() {
@Override
public void success(RSVP result, Response response) {
if (result != null && SUCCESS.equals(result.getCode())) {
Log.d(TAG, "rsvp result: " + result.getCode() + "---" + result.getMessage());
mBtnRsvp.setText(R.string.un_rsvp);
mBtnRsvp.setBackgroundResource(R.drawable.btn_unrsvp_small);
mEvent.rsvp();
mEvent.save();
// TODO update through SyncAdapter
//Event.updateEvent(mEvent);
} else {
Log.d(TAG, "rsvp result return null: ");
}
}
@Override
public void failure(RetrofitError error) {
Log.e(TAG, "failed rsvp");
}
});
}
/**
* This is the response handle to handle the callbacks from unRSVP rest request
*
* @param ukey
* @param eventId
*/
private void processUnRSVP(String ukey, long eventId) {
//obClient.postUnRsvpToEvent(mEvent.getEventId(), key, unRsvpResponseHandler);
OneBrickRESTClient.getInstance().unrsvp(ukey, eventId, new Callback<RSVP>() {
@Override
public void success(RSVP result, Response response) {
if (result != null && SUCCESS.equals(result.getCode())) {
Log.d(TAG, "unrsvp result: " + result.getCode() + "---" + result.getMessage());
mBtnRsvp.setText(R.string.rsvp);
mBtnRsvp.setBackgroundResource(R.drawable.btn_rsvp_small);
mEvent.unRsvp();
mEvent.save();
} else {
Log.d(TAG, "unrsvp result return null: ");
}
}
@Override
public void failure(RetrofitError error) {
Log.e(TAG, "failed to unrsvp");
}
});
}
// Call to update the share intent
private void setShareIntent() {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
if (mEvent != null) {
shareIntent.putExtra(Intent.EXTRA_SUBJECT, mEvent.getTitle());
shareIntent.putExtra(Intent.EXTRA_TEXT, mEvent.getTitle() + ": " + SOCIAL_URL_PREFIX + mEvent.getEventId());
}
startActivity(Intent.createChooser(shareIntent, getString(R.string.send_intent_title)));
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
String selection = Event.EVENT_ID + "=?";
String[] selectionArgs = new String[]{Long.toString(mEventId)};
return new CursorLoader(this,
ContentProvider.createUri(Event.class, null),
null,
selection,
selectionArgs,
null);
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
if (cursor != null && cursor.moveToFirst()) {
mEvent = Event.fromCursor(cursor);
mAdapter.clear();
if (mTitleCard == null){
mTitleCard = new TitleCard(this, mEvent);
}
mAdapter.add(mTitleCard);
if (mPhotoGalleryCard == null){
mPhotoGalleryCard = new PhotoGalleryCard(this, mEvent);
}
mAdapter.add(mPhotoGalleryCard);
mAdapter.add(new DescriptionCard(this, mEvent));
if (mMapCard == null){
mMapCard = new MapCard(this, mEvent);
}
mAdapter.add(mMapCard);
mAdapter.add(new ContactsCard(this, mEvent));
mAdapter.notifyDataSetChanged();
updateViews();
setupListeners();
} else {
// TODO error
}
}
@Override
public void onLoaderReset(Loader<Cursor> cursorLoader) {
mAdapter.clear();
mEvent = null;
}
@Subscribe
public void onLoginStatusEvent(LoginStatusEvent event) {
if (mPendingRsvp && event.status == Status.SUCCESS) {
processRsvpRequest(mEvent.getEventId());
}
}
@Subscribe
public void onFetchEventDetailEvent(FetchEventDetailEvent event) {
if (event.status == Status.NO_NETWORK) {
Toast.makeText(this, R.string.no_network, Toast.LENGTH_LONG).show();
} else if (event.status == Status.FAILED) {
Toast.makeText(this, R.string.failed_to_fetch_event_detail, Toast.LENGTH_LONG).show();
}
}
}