package net.thesocialos.client.api;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import net.thesocialos.client.CacheLayer;
import net.thesocialos.client.desktop.window.FolderWindow;
import net.thesocialos.client.helper.RPCXSRF;
import net.thesocialos.client.service.SocialService;
import net.thesocialos.client.service.SocialServiceAsync;
import net.thesocialos.client.view.deck.DeckColumn;
import net.thesocialos.shared.model.Account;
import net.thesocialos.shared.model.Facebook;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.jsonp.client.JsonpRequestBuilder;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.googlecode.objectify.Key;
public class FacebookAPI {
private static final SocialServiceAsync socialService = GWT.create(SocialService.class);
public class Album implements MediaAlbum {
private String id;
private String name;
private String thumbnailURL;
private int numPhotos;
@Override
public String getDescription() {
return "";
}
@Override
public int getElementCount() {
return numPhotos;
}
@Override
public String getID() {
return id;
}
@Override
public String getName() {
return name;
}
@Override
public String getThumbnailURL() {
return thumbnailURL;
}
public void setThumbnailUrl(String url) {
thumbnailURL = url;
}
}
public class Picture implements MediaPicture {
private String id;
private String title;
private String url;
private String thumbnailURL;
@Override
public String getDescription() {
return "";
}
@Override
public String getID() {
return id;
}
@Override
public String getName() {
return title;
}
@Override
public String getThumbnailURL() {
return thumbnailURL;
}
@Override
public String getUrl() {
return url;
}
}
public class Post {
private String id;
private String user_id;
private String user_name;
private Date created_at;
private String text;
/**
* @return the created_at date
*/
public Date getCreated_at() {
return created_at;
}
/**
* @return the id
*/
public String getId() {
return id;
}
/**
* @return the text
*/
public String getText() {
return text;
}
/**
* @return the user_id
*/
public String getUser_id() {
return user_id;
}
/**
* @return the user_name
*/
public String getUser_name() {
return user_name;
}
}
private Facebook getFacebookAccount() {
// Map<Key<Account>, Account> accounts =
Map<Key<Account>, Account> accounts = CacheLayer.UserCalls.getAccounts();
Iterator<Account> it = accounts.values().iterator();
while (it.hasNext()) {
Account account = it.next();
if (account instanceof Facebook) return (Facebook) account;
}
return null;
}
private void loadAlbumInFolder(final Album album, String cover_photo_id, final FolderWindow folder,
Facebook facebookAccount) {
String facebookAPIurl = "https://graph.facebook.com/" + cover_photo_id + "?access_token="
+ facebookAccount.getAuthToken();
JsonpRequestBuilder jsonp = new JsonpRequestBuilder();
jsonp.requestObject(facebookAPIurl, new AsyncCallback<JavaScriptObject>() {
@Override
public void onFailure(Throwable caught) {
// TODO Auto-generated method stub
System.out.println(caught.getMessage());
caught.printStackTrace();
}
@Override
public void onSuccess(JavaScriptObject result) {
JSONObject object = new JSONObject(result);
album.setThumbnailUrl(object.get("picture").isString().stringValue());
folder.addMedia(album);
}
});
}
public void loadAlbumsInFolder(final FolderWindow folder) {
String facebookAPIurl = "https://graph.facebook.com/";
Facebook facebookAccount = getFacebookAccount();
if (null == facebookAccount) return;
String username = facebookAccount.getUsername();
facebookAPIurl += username + "/albums?access_token=" + facebookAccount.getAuthToken();
loadAlbumsInFolder(folder, facebookAPIurl, facebookAccount);
}
private void loadAlbumsInFolder(final FolderWindow folder, String facebookUrl, final Facebook facebookAccount) {
JsonpRequestBuilder jsonp = new JsonpRequestBuilder();
jsonp.requestObject(facebookUrl, new AsyncCallback<JavaScriptObject>() {
@Override
public void onFailure(Throwable caught) {
// TODO Auto-generated method stub
System.out.println(caught.getMessage());
caught.printStackTrace();
}
@Override
public void onSuccess(JavaScriptObject result) {
JSONObject object = new JSONObject(result);
JSONArray array = object.get("data").isArray();
for (int i = 0; i < array.size(); i++) {
Album album = new Album();
album.id = array.get(i).isObject().get("id").isString().stringValue();
album.name = array.get(i).isObject().get("name").isString().stringValue();
album.numPhotos = Integer.parseInt(array.get(i).isObject().get("count").isNumber().toString());
String cover_photo_id = array.get(i).isObject().get("cover_photo").isString().stringValue();
loadAlbumInFolder(album, cover_photo_id, folder, facebookAccount);
}
JSONValue js = object.get("paging");
if (null != js) {
JSONString nextAlbumsUrl = js.isObject().get("next").isString();
if (null != nextAlbumsUrl && !"".equals(nextAlbumsUrl))
loadAlbumsInFolder(folder, nextAlbumsUrl.stringValue(), facebookAccount);
}
}
});
}
public void loadPicturesInFolder(Album album, final FolderWindow folder) {
String facebookAPIurl = "https://graph.facebook.com/";
Facebook facebookAccount = getFacebookAccount();
if (null == facebookAccount) return;
facebookAPIurl += album.getID() + "/photos?access_token=" + facebookAccount.getAuthToken();
loadPicturesInFolder(folder, facebookAPIurl);
}
private void loadPicturesInFolder(final FolderWindow folder, String facebookUrl) {
JsonpRequestBuilder jsonp = new JsonpRequestBuilder();
jsonp.requestObject(facebookUrl, new AsyncCallback<JavaScriptObject>() {
@Override
public void onFailure(Throwable caught) {
// TODO Auto-generated method stub
System.out.println(caught.getMessage());
caught.printStackTrace();
}
@Override
public void onSuccess(JavaScriptObject result) {
JSONObject object = new JSONObject(result);
HashSet<Picture> pictures = new HashSet<Picture>();
JSONArray array = object.get("data").isArray();
for (int i = 0; i < array.size(); i++) {
Picture picture = new Picture();
picture.id = array.get(i).isObject().get("id").isString().stringValue();
JSONValue s = null;
if ((s = array.get(i).isObject().get("name")) != null) picture.title = s.isString().stringValue();
else
picture.title = picture.getID();
picture.url = array.get(i).isObject().get("source").isString().stringValue();
picture.thumbnailURL = array.get(i).isObject().get("picture").isString().stringValue();
// album.thumbnailURL =
// array.get(i).isObject().get("media$group").isObject().get("media$thumbnail").isArray().get(0).isObject().get("url").isString().stringValue();
pictures.add(picture);
}
if (pictures.size() > 0) folder.addMedia(pictures);
JSONValue js = object.get("paging");
if (null != js) {
JSONString nextPicturesUrl = js.isObject().get("next").isString();
if (null != nextPicturesUrl && !"".equals(nextPicturesUrl))
loadPicturesInFolder(folder, nextPicturesUrl.stringValue());
}
}
});
}
public void post(final String message) {
final Facebook facebookAccount = getFacebookAccount();
new RPCXSRF<String>(socialService) {
@Override
public void onFailure(Throwable caught) {
caught.printStackTrace();
}
@Override
public void onSuccess(String result) {
// Window.alert(result);
new Timer() {
@Override
public void run() {
// loadColumns(facebookAccount);
}
}.schedule(1000);
}
@Override
protected void XSRFcallService(AsyncCallback<String> cb) {
socialService.postOnFacebook(facebookAccount, message, cb);
}
}.retry(3);
}
public void loadWall(final DeckColumn panel) {
Facebook facebookAccount = getFacebookAccount();
if (null == facebookAccount) return;
String urlString = "https://graph.facebook.com/me/home?access_token=" + facebookAccount.getAuthToken();
JsonpRequestBuilder jsonp = new JsonpRequestBuilder();
jsonp.requestObject(urlString, new AsyncCallback<JavaScriptObject>() {
@Override
public void onFailure(Throwable caught) {
GWT.log(caught.getMessage());
}
@Override
public void onSuccess(JavaScriptObject result) {
JSONObject object = new JSONObject(result);
HashSet<Post> posts = new HashSet<Post>();
JSONArray array = object.get("data").isArray();
for (int i = 0; i < array.size(); i++) {
Post post = new Post();
post.id = array.get(i).isObject().get("id").isString().stringValue();
post.user_id = array.get(i).isObject().get("from").isObject().get("id").isString().stringValue();
post.user_name = array.get(i).isObject().get("from").isObject().get("name").isString()
.stringValue();
String text = "";
if (null != array.get(i).isObject().get("message")) text = array.get(i).isObject().get("message")
.isString().stringValue();
else if (null != array.get(i).isObject().get("story")) text = array.get(i).isObject().get("story")
.isString().stringValue();
else if (null != array.get(i).isObject().get("caption")) text = array.get(i).isObject()
.get("caption").isString().stringValue();
else if (null != array.get(i).isObject().get("description"))
text = array.get(i).isObject().get("description").isString().stringValue();
post.text = text;
post.created_at = new Date(array.get(i).isObject().get("created_time").isString().stringValue());
posts.add(post);
}
Set<Post> oldPosts = panel.getPosts();
if (null != oldPosts && !oldPosts.isEmpty()) posts.addAll(posts);
else
panel.setPosts(posts);
// panel.clearPosts();
panel.loadAll();
}
});
}
}