package com.abewy.android.apps.klyph.app;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.json.JSONException;
import org.json.JSONObject;
import android.annotation.TargetApi;
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.widget.ImageButton;
import android.widget.PopupMenu;
import android.widget.PopupMenu.OnMenuItemClickListener;
import android.widget.TextView;
import com.abewy.android.apps.klyph.KlyphBundleExtras;
import com.abewy.android.apps.klyph.KlyphData;
import com.abewy.android.apps.klyph.KlyphPreferences;
import com.abewy.android.apps.klyph.R;
import com.abewy.android.apps.klyph.core.fql.FriendList;
import com.abewy.android.apps.klyph.core.fql.Tag;
import com.abewy.android.apps.klyph.core.graph.GraphObject;
import com.abewy.android.apps.klyph.core.graph.GraphType;
import com.abewy.android.apps.klyph.core.request.BaseAsyncRequest.Callback;
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.AlertUtil;
import com.abewy.android.apps.klyph.core.util.AttrUtil;
import com.abewy.android.apps.klyph.facebook.IFbPermissionCallback;
import com.abewy.android.apps.klyph.fragment.AlbumSpinner;
import com.abewy.android.apps.klyph.fragment.AlbumSpinner.AlbumSpinnerListener;
import com.abewy.android.apps.klyph.fragment.PostPhotos;
import com.abewy.android.apps.klyph.fragment.PostPhotos.PostPhotoListener;
import com.abewy.android.apps.klyph.fragment.UserListDialog;
import com.abewy.android.apps.klyph.request.AsyncRequest;
import com.abewy.android.apps.klyph.request.AsyncRequest.Query;
import com.abewy.android.apps.klyph.service.UploadPhotoService;
import com.abewy.android.apps.klyph.util.TextViewUtil;
import com.abewy.android.apps.klyph.util.TextViewUtil.TagCallback;
import com.facebook.Session;
public class PostPhotosActivity extends TitledFragmentActivity implements PostPhotoListener, AlbumSpinnerListener, IFbPermissionCallback
{
private enum Privacy
{
EVERYONE,
ALL_FRIENDS,
SELF,
CUSTOM
}
private final int GALLERY = 0;
private final int FRIEND_PICKER = 1;
private final int PLACE_PICKER = 2;
private static final List<String> PERMISSIONS = Arrays.asList("publish_stream", "photo_upload", "status_update");
private TextView messageTextView;
private TextView friendsTextView;
private TextView placeTextView;
private ImageButton friendsButton;
private ImageButton privacyButton;
private PostPhotos photosFragment;
private AlbumSpinner albumsFragment;
private Privacy privacy = Privacy.SELF;
private Map<String, String> friends;
private String placeId;
private List<String> photoUris;
private boolean pendingAnnounce = false;
private List<GraphObject> friendLists;
private String privacyFriendListId;
private TagCallback friendCallback = new TagCallback() {
@Override
public void onTagClick(List<Tag> tags)
{
Tag tag = tags.get(0);
if (tag.getId().length() == 0)
{
List<Tag> users = new ArrayList<Tag>();
for (Iterator<String> iterator = friends.keySet().iterator(); iterator.hasNext();)
{
String key = (String) iterator.next();
Tag t = new Tag();
t.setId(key);
t.setName(friends.get(key));
t.setType(GraphType.FQL_USER.toString());
users.add(t);
}
UserListDialog dialog = new UserListDialog();
dialog.loadList(users);
dialog.setCustomTitle(R.string.friends);
dialog.show(getFragmentManager(), "poststatusDialog");
}
else
{
TextViewUtil.onTagClick(PostPhotosActivity.this, tags);
}
}
};
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
photoUris = new ArrayList<String>();
setTitle(R.string.publish_new_photos);
messageTextView = (TextView) findViewById(R.id.message_textview);
friendsTextView = (TextView) findViewById(R.id.friends_textview);
placeTextView = (TextView) findViewById(R.id.place_textview);
photosFragment = (PostPhotos) getFragmentManager().findFragmentById(R.id.photos_fragment);
albumsFragment = (AlbumSpinner) getFragmentManager().findFragmentById(R.id.albums_fragment);
albumsFragment.setDefaultAlbumId(getIntent().getExtras().getString(KlyphBundleExtras.ALBUM_ID));
albumsFragment.setOnSelectionChangeListener(this);
getFragmentManager().beginTransaction().hide(photosFragment).commit();
ImageButton placeDeleteButton = (ImageButton) findViewById(R.id.place_delete_button);
ImageButton friendsDeleteButton = (ImageButton) findViewById(R.id.friends_delete_button);
friendsButton = (ImageButton) findViewById(R.id.friends_button);
ImageButton add = (ImageButton) findViewById(R.id.add_button);
ImageButton place = (ImageButton) findViewById(R.id.place_button);
privacyButton = (ImageButton) findViewById(R.id.privacy_button);
privacyButton.setEnabled(false);
placeDeleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
clearPlace();
}
});
friendsDeleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
clearFriends();
}
});
friendsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
Intent intent = new Intent(PostPhotosActivity.this, FriendPickerActivity.class);
if (friends != null && friends.size() > 0)
{
ArrayList<String> ids = new ArrayList<String>();
ids.addAll(friends.keySet());
intent.putStringArrayListExtra(KlyphBundleExtras.FRIEND_PICKER_IDS, ids);
}
startActivityForResult(intent, FRIEND_PICKER);
}
});
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
startGallery();
}
});
place.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
startActivityForResult(new Intent(PostPhotosActivity.this, PlacePickerActivity.class), PLACE_PICKER);
}
});
setPrivacyListenerApi11();
setPrivacy(KlyphPreferences.getPrivacy());
if (KlyphData.getFriendLists() == null)
{
new AsyncRequest(Query.FRIEND_LISTS, "", "", new Callback() {
@Override
public void onComplete(Response response)
{
onRequestComplete(response);
}
}).execute();
}
}
@TargetApi(11)
private void setPrivacyListenerApi11()
{
privacyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
PopupMenu popup = new PopupMenu(PostPhotosActivity.this, v);
android.view.MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.privacy, popup.getMenu());
if (friendLists == null)
friendLists = KlyphData.getFriendLists();
if (friendLists != null)
{
for (GraphObject friendList : friendLists)
{
popup.getMenu().add(((FriendList) friendList).getName());
}
}
popup.setOnMenuItemClickListener(new PopupMenuListener());
popup.show();
}
});
}
private void setPrivacy(int privacy)
{
switch (privacy)
{
case 0:
setPrivacy(Privacy.EVERYONE);
break;
case 1:
setPrivacy(Privacy.ALL_FRIENDS);
break;
case 2:
setPrivacy(Privacy.SELF);
break;
}
}
private void setPrivacy(Privacy privacy)
{
this.privacy = privacy;
if (privacyButton != null)
{
// set changes
switch (privacy)
{
case EVERYONE:
{
privacyButton.setImageDrawable(AttrUtil.getDrawable(this, privacyButton.isEnabled() ? R.attr.privacyPublicIcon
: R.attr.privacyPublicDisabledIcon));
KlyphPreferences.setPrivacy(0);
break;
}
case ALL_FRIENDS:
{
privacyButton.setImageDrawable(AttrUtil.getDrawable(this, privacyButton.isEnabled() ? R.attr.privacyFriendsIcon
: R.attr.privacyFriendsDisabledIcon));
KlyphPreferences.setPrivacy(1);
break;
}
case SELF:
{
privacyButton.setImageDrawable(AttrUtil.getDrawable(this, privacyButton.isEnabled() ? R.attr.privacySelfIcon
: R.attr.privacySelfDisabledIcon));
KlyphPreferences.setPrivacy(2);
break;
}
case CUSTOM:
{
privacyButton.setImageDrawable(AttrUtil.getDrawable(this, privacyButton.isEnabled() ? R.attr.privacyCustomIcon
: R.attr.privacyCustomIcon));
break;
}
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.send, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
if (photoUris.size() == 0)
{
AlertUtil.showAlert(this, R.string.error, R.string.must_select_photos, R.string.ok);
}
/*
* else if (friends != null && friends.size() > 0 && (placeId == null || placeId.length() == 0))
* {
* AlertUtil.showAlert(this, R.string.error, R.string.must_select_place_to_tag_friends, R.string.ok);
* }
*/
else
{
handlePublishPost();
}
return false;
}
/*
* private ArrayList<String> getRealUris()
* {
* ArrayList<String> uris = new ArrayList<String>();
*
* String[] columns_to_return = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA };
* String where = "";
* for (int i = 0; i < photou.size(); i++)
* {
* if (i != 0)
* where += " OR ";
*
* where += MediaStore.Images.Media._ID + " LIKE ?";
* }
*
* String[] values = photoIds.toArray(new String[0]);
*
* Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns_to_return, where, values, null);
*
* if (cursor != null)
* {
* for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext())
* {
* String id = cursor.getString(0);
*
* for (String thumbId : photoIds)
* {
* if (id.equals(thumbId))
* {
* uris.add(cursor.getString(1));
* break;
* }
* }
* }
* }
*
* return uris;
* }
*/
private void publishPhotos()
{
Intent intent = new Intent(this, UploadPhotoService.class);
intent.putStringArrayListExtra(KlyphBundleExtras.UPLOAD_PHOTO_URIS, (ArrayList<String>) photoUris);
intent.putExtra(KlyphBundleExtras.UPLOAD_PHOTO_CAPTION, messageTextView.getText().toString());
intent.putExtra(KlyphBundleExtras.UPLOAD_PHOTO_PLACE, placeId);
intent.putExtra(KlyphBundleExtras.UPLOAD_PHOTO_PRIVACY, getPrivacyParam());
intent.putExtra(KlyphBundleExtras.UPLOAD_PHOTO_ALBUM, albumsFragment.getSelectedAlbum());
if (friends != null && friends.size() > 0)
{
ArrayList<String> friendIds = new ArrayList<String>();
for (String id : friends.keySet())
{
friendIds.add(id);
}
intent.putStringArrayListExtra(KlyphBundleExtras.UPLOAD_PHOTO_TAGS, friendIds);
}
startService(intent);
setResult(RESULT_OK);
finish();
}
private String getPrivacyParam()
{
JSONObject json = new JSONObject();
try
{
json.putOpt("value", privacy.toString());
}
catch (JSONException e)
{
e.printStackTrace();
}
if (privacyFriendListId != null)
{
try
{
json.put("allow", privacyFriendListId);
json.put("deny", "");
}
catch (JSONException e)
{
e.printStackTrace();
}
}
return json.toString();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == GALLERY)
{
if (resultCode == RESULT_OK)
{
photoUris = data.getStringArrayListExtra(KlyphBundleExtras.PHOTO_LIST_URI);
if (photoUris == null)
{
photoUris = new ArrayList<String>();
}
}
}
else if (requestCode == FRIEND_PICKER)
{
if (resultCode == RESULT_OK)
{
friends = new HashMap<String, String>();
String[] names = data.getStringArrayExtra(KlyphBundleExtras.FRIEND_PICKER_NAMES);
String[] ids = data.getStringArrayExtra(KlyphBundleExtras.FRIEND_PICKER_IDS);
for (int i = 0; i < ids.length; i++)
{
friends.put(ids[i], names[i]);
}
updateSelectedFriends();
}
}
else if (requestCode == PLACE_PICKER)
{
if (resultCode == RESULT_OK)
{
placeId = data.getStringExtra(KlyphBundleExtras.PLACE_ID);
String placeName = data.getStringExtra(KlyphBundleExtras.PLACE_NAME);
placeTextView.setText(getString(R.string.at_place, placeName));
((View) placeTextView.getParent()).setVisibility(View.VISIBLE);
TextViewUtil.setElementClickable(this, placeTextView, placeName, placeId, GraphType.FQL_PAGE.toString(), true);
}
}
}
private void clearPlace()
{
placeId = null;
placeTextView.setText("");
((View) placeTextView.getParent()).setVisibility(View.GONE);
}
private void clearFriends()
{
friends = null;
friendsTextView.setText("");
((View) friendsTextView.getParent()).setVisibility(View.GONE);
}
private void updateSelectedFriends()
{
if (friends.size() > 0)
{
String firstName = "";
String firstId = "";
Iterator<String> it = friends.values().iterator();
Iterator<String> it2 = friends.keySet().iterator();
firstName = it.next();
firstId = it2.next();
for (String name : friends.values())
{
firstName = name;
break;
}
if (friends.size() > 2)
{
int size = friends.size() - 1;
friendsTextView.setText(getString(R.string.post_with_several_friends, firstName, size));
TextViewUtil.setElementClickable(this, friendsTextView, firstName, firstId, GraphType.FQL_USER.name(), friendCallback, true);
TextViewUtil.setElementClickable(this, friendsTextView, getString(R.string.with_several_friends, size), "", "", friendCallback, true);
}
else if (friends.size() > 1)
{
String secondName = it.next();
String secondId = it2.next();
friendsTextView.setText(getString(R.string.post_with_two_friends, firstName, secondName));
TextViewUtil.setElementClickable(this, friendsTextView, firstName, firstId, GraphType.FQL_USER.name(), friendCallback, true);
TextViewUtil.setElementClickable(this, friendsTextView, secondName, secondId, GraphType.FQL_USER.name(), friendCallback, true);
}
else
{
friendsTextView.setText(getString(R.string.post_with_one_friend, firstName));
TextViewUtil.setElementClickable(this, friendsTextView, firstName, firstId, GraphType.FQL_USER.name(), friendCallback, true);
}
((View) friendsTextView.getParent()).setVisibility(View.VISIBLE);
}
else
{
friendsTextView.setText("");
((View) friendsTextView.getParent()).setVisibility(View.GONE);
}
}
@Override
protected int getLayout()
{
return R.layout.activity_post_photos;
}
@TargetApi(11)
private class PopupMenuListener implements OnMenuItemClickListener
{
@Override
public boolean onMenuItemClick(android.view.MenuItem item)
{
if (item.getItemId() == R.id.privacy_public)
{
setPrivacy(Privacy.EVERYONE);
privacyFriendListId = null;
return true;
}
else if (item.getItemId() == R.id.privacy_friends)
{
setPrivacy(Privacy.ALL_FRIENDS);
privacyFriendListId = null;
return true;
}
else if (item.getItemId() == R.id.privacy_self)
{
setPrivacy(Privacy.SELF);
privacyFriendListId = null;
return true;
}
else
{
setPrivacy(Privacy.CUSTOM);
String flName = (String) item.getTitle();
for (GraphObject friendList : friendLists)
{
FriendList fl = (FriendList) friendList;
if (flName.equals(fl.getName()))
{
privacyFriendListId = fl.getFlid();
break;
}
}
}
return false;
}
}
@Override
protected void onSaveInstanceState(Bundle outState)
{
// No call for super(). Bug on API Level > 11.
}
@Override
protected void onResumeFragments()
{
Log.d("onResumeFragments", "photo size " + photoUris.size());
if (photoUris.size() > 0)
{
photosFragment.setImages(photoUris);
/*
* LayoutParams params = photosFragment.getGridView().getLayoutParams();
*
* if (photoIds.size() <= 4)
* {
* params.height = (int) ((KlyphDevice.getDeviceWidth() - (48 + 8 + 2) * KlyphDevice.getDeviceDensity()) / 4);
* }
* else
* {
* params.height = (int) ((KlyphDevice.getDeviceWidth() - (48 + 8 + 2) * KlyphDevice.getDeviceDensity()) / 2);
* }
* photosFragment.getGridView().setLayoutParams(params);
*/
getFragmentManager().beginTransaction().show(photosFragment).commit();
}
else
{
getFragmentManager().beginTransaction().hide(photosFragment).commit();
}
super.onResumeFragments();
}
@Override
public void onPostPhotosItemClick()
{
startGallery();
}
private void startGallery()
{
Intent intent = new Intent(PostPhotosActivity.this, GalleryActivity.class);
intent.putStringArrayListExtra(KlyphBundleExtras.PHOTO_LIST_URI, (ArrayList<String>) photoUris);
startActivityForResult(intent, GALLERY);
}
@Override
public void onPostPhotosDeleteClick()
{
photoUris = new ArrayList<String>();
getFragmentManager().beginTransaction().hide(photosFragment).commit();
// getFragmentManager().beginTransaction().hide(albumsFragment).commit();
}
private void handlePublishPost()
{
pendingAnnounce = false;
Session session = Session.getActiveSession();
List<String> permissions = session.getPermissions();
if (!permissions.containsAll(PERMISSIONS))
{
pendingAnnounce = true;
requestPublishPermissions(this, PERMISSIONS);
return;
}
publishPhotos();
}
@Override
public void onAlbumSpinnerSelectionChange()
{
privacyButton.setEnabled(albumsFragment.getSelectedAlbum().equals("me"));
setPrivacy(privacy);
}
@Override
public void onPermissionsChange()
{
if (pendingAnnounce == true)
{
handlePublishPost();
}
}
@Override
public void onCancelPermissions()
{
}
@Override
public void onDestroy()
{
super.onDestroy();
messageTextView = null;
friendsTextView = null;
placeTextView = null;
friendsButton = null;
privacyButton = null;
photosFragment = null;
albumsFragment = null;
privacy = null;
friends = null;
placeId = null;
photoUris = null;
friendCallback = null;
}
// ___ Loading friend lists
private void onRequestComplete(final Response response)
{
runOnUiThread(new Runnable() {
@Override
public void run()
{
if (response.getError() == null)
{
onRequestSuccess(response.getGraphObjectList());
}
else
{
onRequestError(response.getError());
}
}
});
}
private void onRequestSuccess(List<GraphObject> result)
{
KlyphData.setFriendLists(result);
}
private void onRequestError(RequestError error)
{
}
}