/*
* Copyright 2010 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.facebook.stream;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.Bundle;
import com.facebook.android.AsyncFacebookRunner;
import com.facebook.android.Facebook;
/**
* Implements functions that can be called from Javascript in the
* stream page.
*
* @author yariv
*/
class StreamJsHandler {
// The handler for the Stream page
private final StreamHandler streamHandler;
/**
* @param streamHandler
*/
StreamJsHandler(StreamHandler streamHandler) {
this.streamHandler = streamHandler;
}
/**
* Returns the Facebook object.
*/
private AsyncFacebookRunner getFb() {
Facebook fb = Session.restore(streamHandler.getActivity()).getFb();
return new AsyncFacebookRunner(fb);
}
/**
* Update the status and render the resulting status at the
* top of the stream.
*
* @param message
*/
public void updateStatus(final String message) {
AsyncFacebookRunner fb = getFb();
Bundle params = new Bundle();
params.putString("message", message);
fb.request("me/feed", params, "POST", new AsyncRequestListener() {
public void onComplete(JSONObject obj, final Object state) {
String html;
try {
html = renderStatus(obj, message);
html = html.replace("'", "\\\'");
callJs("onStatusUpdated('" + html + "');");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, null);
}
/**
* Renders the html for the new status.
*
* @param response
* @param message
* @return
* @throws JSONException
*/
private String renderStatus(JSONObject response, String message)
throws JSONException {
String postId = response.getString("id");
JSONObject post = new JSONObject();
post.put("id", postId);
post.put("message", message);
JSONObject from = createAuthorObj();
post.put("from", from);
JSONArray actions = new JSONArray();
JSONObject like = new JSONObject();
like.put("name", "Like");
actions.put(like);
JSONObject comment = new JSONObject();
comment.put("name", "Comment");
actions.put(comment);
post.put("actions", actions);
SimpleDateFormat format = StreamRenderer.getDateFormat();
String timestamp = format.format(new Date());
post.put("created_time", timestamp);
String html = StreamRenderer.renderSinglePost(post);
return html;
}
/**
* Like or unlike a post
*
* @param post_id
* @param val if the action should be a like (true) or an unlike (false)
*/
public void like(final String post_id, final boolean val) {
Bundle params = new Bundle();
if (!val) {
params.putString("method", "delete");
}
getFb().request(post_id + "/likes", new Bundle(), "POST",
new AsyncRequestListener() {
public void onComplete(JSONObject response, final Object state) {
callJs("javascript:onLike('" + post_id + "'," + val + ")");
}
}, null);
}
public void postComment(final String post_id, final String message) {
Bundle params = new Bundle();
params.putString("message", message);
getFb().request(post_id + "/comments", params, "POST",
new AsyncRequestListener() {
public void onComplete(JSONObject response, final Object state) {
try {
String html = renderComment(response, message);
html = html.replace("'", "\\'");
callJs("onComment('" + post_id + "','" + html + "');");
} catch (JSONException e) {
e.printStackTrace();
}
}
}, null);
}
/**
* Renders the html string for a new comment.
*
* @param response
* @param message
* @return
* @throws JSONException
*/
private String renderComment(JSONObject response, String message)
throws JSONException {
JSONObject comment = new JSONObject();
String commentId = response.getString("id");
comment.put("id", commentId);
comment.put("from", createAuthorObj());
comment.put("message", message);
String html = StreamRenderer.renderSingleComment(comment);
return html;
}
/**
* Executes javascript code inside WebKit.
*
* @param js
*/
private void callJs(String js) {
streamHandler.getWebView().loadUrl("javascript:" + js);
}
/**
* Creates a JSONObject for the post or comment author.
*
* @return
* @throws JSONException
*/
private JSONObject createAuthorObj() throws JSONException {
Session session = Session.restore(streamHandler.getActivity());
JSONObject from = new JSONObject();
from.put("id", session.getUid());
from.put("name", session.getName());
return from;
}
}