package com.abewy.android.apps.klyph.fragment; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import android.app.AlertDialog; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Toast; import com.abewy.android.apps.klyph.Klyph; import com.abewy.android.apps.klyph.KlyphBundleExtras; import com.abewy.android.apps.klyph.KlyphPreferences; import com.abewy.android.apps.klyph.R; import com.abewy.android.apps.klyph.adapter.AdapterSelector; import com.abewy.android.apps.klyph.adapter.MultiObjectAdapter; import com.abewy.android.apps.klyph.adapter.NewsfeedAdapter; import com.abewy.android.apps.klyph.adapter.SpecialLayout; import com.abewy.android.apps.klyph.adapter.animation.GoogleCardStyleAdapter; import com.abewy.android.apps.klyph.app.PostActivity; import com.abewy.android.apps.klyph.core.fql.Event; import com.abewy.android.apps.klyph.core.fql.Stream; import com.abewy.android.apps.klyph.core.fql.Event.EventResponse; import com.abewy.android.apps.klyph.core.graph.GraphObject; import com.abewy.android.apps.klyph.core.request.RequestError; import com.abewy.android.apps.klyph.core.request.Response; import com.abewy.android.apps.klyph.core.util.AttrUtil; import com.abewy.android.apps.klyph.facebook.IFbPermissionCallback; import com.abewy.android.apps.klyph.facebook.IFbPermissionWorker; import com.abewy.android.apps.klyph.request.AsyncRequest; import com.abewy.android.apps.klyph.request.AsyncRequest.Query; import com.abewy.android.apps.klyph.widget.KlyphGridView; import com.facebook.Session; public class EventFragment extends KlyphFragment2 implements IFbPermissionCallback { private static final List<String> PERMISSIONS = Arrays.asList("rsvp_event"); private Event event; private OnClickListener attendButtonListener; private OnClickListener unsureButtonListener; private OnClickListener declinedButtonListener; private OnClickListener invitedGuestListener; private OnClickListener goingGuestListener; private OnClickListener unsureGuestListener; private OnClickListener declinedGuestListener; private boolean pendingAnnounce = false; private int pendingRequest; public EventFragment() { super(); setRequestType(Query.EVENT_TIMELINE); } @Override protected int getCustomLayout() { return R.layout.grid_timeline; } @Override protected boolean updateNumColumnOnOrientationChange() { return false; } @Override protected int getNumColumn() { return 1; } @Override public void onPermissionsChange() { if (pendingAnnounce) { handleResponseClick(pendingRequest); } } @Override public void onCancelPermissions() { } private void requestPublishPermissions(Session session) { ((IFbPermissionWorker) getActivity()).requestPublishPermissions(this, PERMISSIONS); } private void handleResponseClick(int request) { pendingAnnounce = false; Session session = Session.getActiveSession(); List<String> permissions = session.getPermissions(); if (!permissions.containsAll(PERMISSIONS)) { pendingAnnounce = true; pendingRequest = request; requestPublishPermissions(session); return; } sendRequest(request); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { defineEmptyText(R.string.empty_list_no_data); setListVisible(false); attendButtonListener = new View.OnClickListener() { @Override public void onClick(View v) { if (!event.isUserAttendingEvent()) { handleResponseClick(Query.POST_EVENT_ATTEND); } } }; unsureButtonListener = new View.OnClickListener() { @Override public void onClick(View v) { if (!event.isUserUnsureEvent()) { handleResponseClick(Query.POST_EVENT_UNSURE); } } }; declinedButtonListener = new View.OnClickListener() { @Override public void onClick(View v) { if (!event.isUserDeclinedEvent()) { handleResponseClick(Query.POST_EVENT_DECLINE); } } }; invitedGuestListener = new View.OnClickListener() { @Override public void onClick(View v) { UserListDialog dialog = new UserListDialog(); dialog.setCustomTitle(getString(R.string.event_num_invitee, event.getAll_members_count())); dialog.setRequestType(Query.EVENT_INVITED); dialog.setElementId(event.getEid()); dialog.show(getFragmentManager(), ""); dialog.load(); } }; goingGuestListener = new View.OnClickListener() { @Override public void onClick(View v) { UserListDialog dialog = new UserListDialog(); dialog.setCustomTitle(getString(R.string.event_num_attending, event.getAttending_count())); dialog.setRequestType(Query.EVENT_GOING); dialog.setElementId(event.getEid()); dialog.show(getFragmentManager(), ""); dialog.load(); } }; unsureGuestListener = new View.OnClickListener() { @Override public void onClick(View v) { UserListDialog dialog = new UserListDialog(); dialog.setCustomTitle(getString(R.string.event_num_unsure, event.getUnsure_count())); dialog.setRequestType(Query.EVENT_MAYBE); dialog.setElementId(event.getEid()); dialog.show(getFragmentManager(), ""); dialog.load(); } }; declinedGuestListener = new View.OnClickListener() { @Override public void onClick(View v) { UserListDialog dialog = new UserListDialog(); dialog.setCustomTitle(getString(R.string.event_num_declined, event.getDeclined_count())); dialog.setRequestType(Query.EVENT_DECLINED); dialog.setElementId(event.getEid()); dialog.show(getFragmentManager(), ""); dialog.load(); } }; setRequestType(Query.EVENT_TIMELINE); setNewestRequestType(Query.EVENT_TIMELINE); super.onViewCreated(view, savedInstanceState); MultiObjectAdapter adapter = /*KlyphPreferences.areBannerAdsEnabled() ? new NewsfeedAdapter(getListView(), SpecialLayout.EVENT_ABOUT) : */new MultiObjectAdapter(getListView(), SpecialLayout.EVENT_ABOUT); if (KlyphPreferences.animateCards()) { GoogleCardStyleAdapter gcsAdapter = new GoogleCardStyleAdapter(adapter); gcsAdapter.setAbsListView(getListView()); setListAdapter(gcsAdapter); } else { setListAdapter(adapter); } } @Override protected void populate(List<GraphObject> data) { Log.d("EventFragment", "populate: " + data.size()); if (data.size() > 0) { GraphObject o = data.get(0); if (o instanceof Event) { event = (Event) o; data.remove(0); if (getActivity() != null) getActivity().setTitle(event.getName()); List<GraphObject> list = new ArrayList<GraphObject>(); list.add(event); EventData eventData = new EventData(event); list.add(eventData); EventResponseItem responseItem = new EventResponseItem(event); responseItem.setAttendButtonListener(attendButtonListener); responseItem.setUnsureButtonListener(unsureButtonListener); responseItem.setDeclineButtonListener(declinedButtonListener); list.add(responseItem); EventAttendees attendeesItem = new EventAttendees(event); attendeesItem.setInvitedListener(invitedGuestListener); attendeesItem.setGoingListener(goingGuestListener); attendeesItem.setUnsureListener(unsureGuestListener); attendeesItem.setDeclinedListener(declinedGuestListener); list.add(attendeesItem); list.addAll(data); data = list; getActivity().invalidateOptionsMenu(); } } super.populate(data); setNoMoreData(true); } @Override protected void populateNewest(List<GraphObject> data) { getAdapter().clear(); populate(data); } private void sendRequest(int query) { final EventResponse eventResponse; switch (query) { case Query.POST_EVENT_ATTEND: { eventResponse = EventResponse.ATTENDING; break; } case Query.POST_EVENT_UNSURE: { eventResponse = EventResponse.UNSURE; break; } case Query.POST_EVENT_DECLINE: { eventResponse = EventResponse.DECLINED; break; } default: { eventResponse = EventResponse.NOT_REPLIED; break; } } final AlertDialog publishing = new AlertDialog.Builder(getActivity()).setTitle(R.string.event_response_dialog_title) .setMessage(R.string.event_response_dialog_message).setCancelable(false).create(); publishing.show(); new AsyncRequest(query, event.getEid(), "", new AsyncRequest.Callback() { @Override public void onComplete(Response response) { publishing.dismiss(); onRequestComplete(response, eventResponse); } }).execute(); } private void onRequestComplete(final Response response, final EventResponse eventResponse) { if (getActivity() != null) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { if (response.getError() == null) { onEventRequestSuccess(response.getGraphObjectList(), eventResponse); } else { onEventRequestError(response.getError()); } } }); } } private void onEventRequestSuccess(List<GraphObject> result, EventResponse eventResponse) { event.setUserResponse(eventResponse.toString().toLowerCase()); getAdapter().notifyDataSetChanged(); Toast.makeText(getActivity(), R.string.event_response_ok, Toast.LENGTH_SHORT).show(); } private void onEventRequestError(RequestError error) { new AlertDialog.Builder(getActivity()).setTitle(R.string.error).setMessage(R.string.event_response_error) .setPositiveButton(R.string.ok, null).create().show(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); if (event != null && menu.findItem(R.id.menu_share) == null) { menu.add(Menu.NONE, R.id.menu_share, 3, getString(R.string.share)).setIcon(AttrUtil.getResourceId(getActivity(), R.attr.shareIcon)) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.menu_share) { Intent intent = new Intent(getActivity(), PostActivity.class); intent.putExtra(KlyphBundleExtras.SHARE, true); intent.putExtra(KlyphBundleExtras.SHARE_LINK_URL, "http://www.facebook.com/events/" + event.getEid()); intent.putExtra(KlyphBundleExtras.SHARE_LINK_IMAGE_URL, event.getPic()); intent.putExtra(KlyphBundleExtras.SHARE_LINK_NAME, event.getName()); intent.putExtra(KlyphBundleExtras.SHARE_LINK_DESC, event.getDescription()); startActivity(intent); return true; } return super.onOptionsItemSelected(item); } @Override protected void onGridItemClick(KlyphGridView gridView, View view, int position, long id) { GraphObject o = (GraphObject) gridView.getItemAtPosition(position); if (o instanceof Stream) { Stream stream = (Stream) o; startActivity(Klyph.getIntentForGraphObject(getActivity(), stream)); } } @Override public void onDestroy() { super.onDestroy(); event = null; attendButtonListener = null; unsureButtonListener = null; declinedButtonListener = null; invitedGuestListener = null; goingGuestListener = null; unsureGuestListener = null; declinedGuestListener = null; pendingRequest = Query.NONE; } public static class EventData extends GraphObject { private final Event event; public EventData(Event event) { this.event = event; } @Override public int getItemViewType() { return AdapterSelector.EVENT_DATA; } public Event getEvent() { return event; } } public static class EventResponseItem extends GraphObject { private final Event event; private OnClickListener attendButtonListener; private OnClickListener unsureButtonListener; private OnClickListener declineButtonListener; public EventResponseItem(Event event) { this.event = event; } public int getItemViewType() { return AdapterSelector.EVENT_RESPONSE; } public Event getEvent() { return event; } public OnClickListener getAttendButtonListener() { return attendButtonListener; } public void setAttendButtonListener(OnClickListener attendButtonListener) { this.attendButtonListener = attendButtonListener; } public OnClickListener getUnsureButtonListener() { return unsureButtonListener; } public void setUnsureButtonListener(OnClickListener unsureButtonListener) { this.unsureButtonListener = unsureButtonListener; } public OnClickListener getDeclineButtonListener() { return declineButtonListener; } public void setDeclineButtonListener(OnClickListener declineButtonListener) { this.declineButtonListener = declineButtonListener; } } public static class EventAttendees extends GraphObject { private final Event event; private OnClickListener invitedListener; private OnClickListener goingListener; private OnClickListener unsureListener; private OnClickListener declinedListener; public EventAttendees(Event event) { this.event = event; } public int getItemViewType() { return AdapterSelector.EVENT_ATTENDEES; } public Event getEvent() { return event; } public OnClickListener getInvitedListener() { return invitedListener; } public void setInvitedListener(OnClickListener invitedListener) { this.invitedListener = invitedListener; } public OnClickListener getGoingListener() { return goingListener; } public void setGoingListener(OnClickListener goingListener) { this.goingListener = goingListener; } public OnClickListener getUnsureListener() { return unsureListener; } public void setUnsureListener(OnClickListener unsureListener) { this.unsureListener = unsureListener; } public OnClickListener getDeclinedListener() { return declinedListener; } public void setDeclinedListener(OnClickListener declinedListener) { this.declinedListener = declinedListener; } } }