package com.abewy.android.apps.klyph.fragment; import java.util.Arrays; import java.util.List; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.ListView; 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.MultiObjectAdapter; import com.abewy.android.apps.klyph.adapter.SpecialLayout; import com.abewy.android.apps.klyph.adapter.animation.GoogleCardStyleAdapter; import com.abewy.android.apps.klyph.app.MainActivity; import com.abewy.android.apps.klyph.app.PostActivity; import com.abewy.android.apps.klyph.core.KlyphSession; import com.abewy.android.apps.klyph.core.fql.Stream; import com.abewy.android.apps.klyph.core.fql.User; import com.abewy.android.apps.klyph.core.graph.GraphObject; import com.abewy.android.apps.klyph.core.util.AlertUtil; 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.Query; import com.facebook.FacebookException; import com.facebook.FacebookOperationCanceledException; import com.facebook.Session; import com.facebook.widget.WebDialog; public class UserTimeline extends KlyphFakeHeaderListFragment implements IFbPermissionCallback { private static final List<String> PERMISSIONS = Arrays.asList("publish_actions", "publish_stream"); private static final int POST_CODE = 101; private static final int STREAM_CODE = 102; private GraphObject element; private boolean pendingAnnounce = false; private User user; public UserTimeline() { setRequestType(Query.USER_TIMELINE_FEED); setNewestRequestType(Query.USER_TIMELINE_FEED); } /* * public ElementTimeline(GraphType elementType) * { * this(); * this.elementType = elementType; * } */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setNewestInsertIndex(1); } public void setUser(User user) { this.user = user; if (getActivity() != null) getActivity().invalidateOptionsMenu(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK && requestCode == POST_CODE) { if (isNewestLoading() == false) { setPullToRefreshRefreshing(true); loadNewest(); } } else if (resultCode == Activity.RESULT_OK && requestCode == STREAM_CODE) { if (data != null) { boolean deleted = data.getBooleanExtra(KlyphBundleExtras.DELETED, false); if (deleted == true) { String id = data.getStringExtra(KlyphBundleExtras.STREAM_ID); for (GraphObject stream : getAdapter().getItems()) { if (((Stream) stream).getPost_id().equals(id)) { stream.setToDelete(true); getAdapter().remove(stream, true); break; } } } } } } @Override public void onPermissionsChange() { if (pendingAnnounce) { handleNewPostClick(); } } @Override public void onCancelPermissions() { pendingAnnounce = false; } private void handleNewPostClick() { pendingAnnounce = false; Session session = Session.getActiveSession(); List<String> permissions = session.getPermissions(); if (!permissions.containsAll(PERMISSIONS)) { pendingAnnounce = true; ((IFbPermissionWorker) getActivity()).requestPublishPermissions(this, PERMISSIONS); return; } if (getIntentParam() == KlyphBundleExtras.USER_ID) { if (getElementId().equals(KlyphSession.getSessionUserId())) { Intent intent = new Intent(getActivity(), PostActivity.class); intent.putExtra(getIntentParam(), getElementId()); startActivityForResult(intent, POST_CODE); } else { publishFeedDialog(); } } else { Intent intent = new Intent(getActivity(), PostActivity.class); intent.putExtra(getIntentParam(), getElementId()); startActivityForResult(intent, POST_CODE); } } protected boolean canPost() { return user != null && user.getCan_post(); } protected String getIntentParam() { return KlyphBundleExtras.USER_ID; } private void publishFeedDialog() { Bundle params = new Bundle(); params.putString("from", KlyphSession.getSessionUserId()); params.putString("to", getElementId()); WebDialog feedDialog = (new WebDialog.FeedDialogBuilder(getActivity(), Session.getActiveSession(), params)).setOnCompleteListener( new WebDialog.OnCompleteListener() { @Override public void onComplete(Bundle values, FacebookException error) { if (error == null) { final String postId = values.getString("post_id"); if (postId != null) { Toast.makeText(getActivity(), R.string.message_successfully_published, Toast.LENGTH_SHORT).show(); loadNewest(); } else { // User clicked the Cancel button Toast.makeText(getActivity().getApplicationContext(), "Publish cancelled", Toast.LENGTH_SHORT).show(); } } else if (error instanceof FacebookOperationCanceledException) { // User clicked the "x" button // Toast.makeText(getActivity().getApplicationContext(), // "Publish cancelled", // Toast.LENGTH_SHORT).show(); } else { AlertUtil.showAlert(getActivity(), R.string.error, R.string.publish_message_unknown_error, R.string.ok); } } }).build(); feedDialog.show(); } @Override protected int getCustomLayout() { return R.layout.list_timeline; } protected GraphObject getElement() { return element; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { defineEmptyText(R.string.empty_list_no_stream); setListVisible(false); getListView().setDrawSelectorOnTop(true); getListView().setSelector(AttrUtil.getResourceId(getActivity(), R.attr.streamSelector)); super.onViewCreated(view, savedInstanceState); MultiObjectAdapter adapter = /*KlyphPreferences.areBannerAdsEnabled() ? new NewsfeedAdapter(getListView(), SpecialLayout.ELEMENT_TIMELINE) : */new MultiObjectAdapter(getListView(), SpecialLayout.ELEMENT_TIMELINE); if (KlyphPreferences.animateCards()) { GoogleCardStyleAdapter gcsAdapter = new GoogleCardStyleAdapter(adapter); gcsAdapter.setAbsListView(getListView()); setListAdapter(gcsAdapter); } else { setListAdapter(adapter); } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if (canPost()) { if (!(getActivity() instanceof MainActivity)) { menu.add(Menu.NONE, R.id.menu_post, Menu.NONE, "Post").setIcon(R.drawable.ic_edit_dark) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } else { menu.add(Menu.NONE, R.id.menu_post, Menu.NONE, "Post").setIcon(AttrUtil.getResourceId(getActivity(), R.attr.editIcon)) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } } // Does not work at the moment // menu.add(Menu.NONE, R.id.menu_add_friend, Menu.NONE, "Add Friend").setIcon(AttrUtil.getResourceId(getActivity(), R.attr.addFriendIcon)) // .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.menu_post) { handleNewPostClick(); return true; } return super.onOptionsItemSelected(item); } @Override protected void populate(List<GraphObject> data) { super.populate(data); if (getAdapter().getCount() > 1) setOffset(((Stream) getAdapter().getLastItem()).getCreated_time()); else setNoMoreData(true); } @Override protected String getNewestOffset(GraphObject graphObject) { Stream stream = (Stream) graphObject; return stream.getCreated_time(); } @Override public void onListItemClick(ListView l, View v, int position, long id) { GraphObject object = (GraphObject) l.getItemAtPosition(position); if (object instanceof Stream) { Stream stream = (Stream) object; if (stream.isSelectable(0) == true) { startActivityForResult(Klyph.getIntentForGraphObject(getActivity(), stream), STREAM_CODE); } } } }