package com.rec.photoeditor.share;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Observer;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import com.facebook.android.AsyncFacebookRunner;
import com.facebook.android.BaseRequestListener;
import com.facebook.android.DialogError;
import com.facebook.android.Facebook;
import com.facebook.android.FacebookError;
import com.facebook.android.SessionEvents;
import com.facebook.android.SessionStore;
import com.facebook.android.Facebook.DialogListener;
import com.facebook.android.SessionEvents.AuthListener;
import com.facebook.android.SessionEvents.LogoutListener;
import com.google.common.io.ByteStreams;
import com.rec.photoeditor.Platform;
public class FacebookShare extends RECEditorShare {
private static final String TAG = "Photo Editor";
public static final int AUTHORIZE_FACEBOOK = 2;
private static final String FACEBOOK_APP_ID = "384752688250981";
private Context context;
private Handler uiThreadHandler;
private String facebookUserName = "";
// private Activity parentActivity;
public FacebookShare(Context _context, Observer _observer) {
super(_context, _observer);
context = _context;
uiThreadHandler = new Handler();
}
public void handleLoginButtonClick() {
}
public void postPhotoOnFacebook(String pathToImage, String messageToSend) {
if (!Platform.facebook.isSessionValid()) {
facebookLogIn();
} else {
postImage(pathToImage, messageToSend);
}
}
public void facebookLogIn() {
Log.w("REC Photo Editor", "Log In Facebook");
}
public void facebookLogOut() {
Log.w("REC Photo Editor", "Log Out Facebook");
SessionEvents.onLogoutBegin();
AsyncFacebookRunner asyncRunner = new AsyncFacebookRunner(
Platform.facebook);
asyncRunner.logout(context, new LogoutRequestListener());
}
private void postImage(String imagePath, String message) {
Bundle params = new Bundle();
try {
params.putString("caption", message);
params.putByteArray("photo", ByteStreams
.toByteArray(new FileInputStream(new File(imagePath))));
Platform.asyncFbRunner.request("me/photos", params, "POST",
new PhotoUploadListener(), null);
} catch (IOException e) {
e.printStackTrace();
}
success=true;
notifyObservers(new ShareMessages(
ShareMessages.FACEBOOK_UPLOADING_PHOTO, ""));
}
// FB
public class FbAPIsAuthListener implements AuthListener {
public void onAuthSucceed() {
requestUserData();
SessionStore.save(Platform.facebook, context);
}
public void onAuthFail(String error) {
notifyObservers(new ShareMessages(ShareMessages.FACEBOOK_AUTH_FAIL,
error));
}
}
// FB
public void requestUserData() {
Bundle params = new Bundle();
params.putString("fields", "name, picture");
Platform.asyncFbRunner.request("me", params, new UserRequestListener());
}
public String getFacebookUserName() {
return facebookUserName;
}
/*
* The Callback for notifying the application when log out starts and
* finishes.
*/
// FB
public class FbAPIsLogoutListener implements LogoutListener {
public void onLogoutBegin() {
Log.w("REC Photo Editor", "Facebook Logging Out...");
}
public void onLogoutFinish() {
SessionStore.clear(context);
notifyObservers(new ShareMessages(
ShareMessages.FACEBOOK_LOGOUT_SUCCESS, ""));
}
}
/*
* Callback for fetching current user's name, picture, uid.
*/
// FB
public class UserRequestListener extends BaseRequestListener {
public void onComplete(final String response, final Object state) {
JSONObject jsonObject;
try {
jsonObject = new JSONObject(response);
final String name = jsonObject.getString("name");
Platform.userUID = jsonObject.getString("id");
facebookUserName = name;
notifyObservers(new ShareMessages(
ShareMessages.FACEBOOK_LOGIN_COMPLEATE, name));
} catch (JSONException e) {
e.printStackTrace();
}
}
}
// FB
private class LogoutRequestListener extends BaseRequestListener {
public void onComplete(String response, final Object state) {
/*
* callback should be run in the original thread, not the background
* thread
*/
uiThreadHandler.post(new Runnable() {
public void run() {
SessionEvents.onLogoutFinish();
}
});
}
}
// FB
public class PhotoUploadListener extends BaseRequestListener {
public void onComplete(final String response, final Object state) {
finished = true;
uiThreadHandler.post(new Runnable() {
public void run() {
notifyObservers(new ShareMessages(
ShareMessages.FACEBOOK_UPLOAD_COMPLEATED, ""));
}
});
}
public void onFacebookError(FacebookError error) {
finished = true;
notifyObservers(new ShareMessages(
ShareMessages.FACEBOOK_UPLOAD_FAILED, error.getMessage()));
}
}
public final class FacebookLoginDialogListener implements DialogListener {
public void onComplete(Bundle values) {
SessionEvents.onLoginSuccess();
notifyObservers(new ShareMessages(
ShareMessages.FACEBOOK_LOGIN_SUCCESS, facebookUserName));
}
public void onFacebookError(FacebookError error) {
SessionEvents.onLoginError(error.getMessage());
}
public void onError(DialogError error) {
SessionEvents.onLoginError(error.getMessage());
}
public void onCancel() {
SessionEvents.onLoginError("Action Canceled");
}
}
public void initFacebookSession() {
// TODO Auto-generated method stubvoid initFacebookSession() {
Platform.facebook = new Facebook(FACEBOOK_APP_ID);
Platform.asyncFbRunner = new AsyncFacebookRunner(Platform.facebook);
// restore session if one exists
SessionStore.restore(Platform.facebook, context);
SessionEvents.addAuthListener(new FbAPIsAuthListener());
SessionEvents.addLogoutListener(new FbAPIsLogoutListener());
if (Platform.facebook.isSessionValid()) {
Log.w("REC Photo Editor", "FACEBOOK SESSION IS VALID");
requestUserData();
} else {
Log.w("REC Photo Editor", "FACEBOOK SESSION IS NOT VALID");
}
}
public void setParentActivity(Activity ownerActivity) {
// this.parentActivity = ownerActivity;
}
}