package org.chartsy.main.managers;
import com.google.code.facebookapi.FacebookException;
import com.google.code.facebookapi.FacebookJsonRestClient;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.List;
import java.util.prefs.Preferences;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.border.TitledBorder;
import org.chartsy.main.ChartFrame;
import org.chartsy.main.utils.DesktopUtil;
import org.chartsy.main.utils.ImageExporter;
import org.chartsy.main.utils.MessageType;
import org.chartsy.main.utils.NotifyUtil;
import org.netbeans.api.progress.ProgressHandle;
import org.netbeans.api.progress.ProgressHandleFactory;
import org.openide.util.NbPreferences;
import org.openide.windows.WindowManager;
/**
*
* @author Viorel
*/
public final class FacebookManager
{
private static final String API_KEY = "549641ea0bc5bb4488383e263f286aa0";
private static final String SECRET = "325d3e5ea84c3ba875a526f715b66265";
private static FacebookManager instance;
private boolean loggedIn = false;
private String email = "";
private String pass = "";
private boolean autoLogin = false;
private String sessionKey;
private String sessionSecret;
private PhotoCaptionPanel captionPanel;
public static FacebookManager getDefault()
{
if (instance == null) {
instance = new FacebookManager();
}
return instance;
}
private FacebookManager()
{
loggedIn = false;
Preferences pref = NbPreferences.forModule(FacebookManager.class);
email = pref.get("facebook_email", "");
pass = pref.get("facebook_pass", "");
autoLogin = pref.getBoolean("facebook_auto_login", false);
if (autoLogin) {
login();
}
}
public void reinitialize()
{
Preferences pref = NbPreferences.forModule(FacebookManager.class);
email = pref.get("facebook_email", "");
pass = pref.get("facebook_pass", "");
autoLogin = pref.getBoolean("facebook_auto_login", false);
if (autoLogin) {
login();
}
}
public boolean isLoggedIn()
{
return loggedIn;
}
public void logout()
{
loggedIn = false;
}
public void login()
{
if (email.isEmpty() || pass.isEmpty()) {
NotifyUtil.warn("Acount Data", "You need to specify and account e-mail and password.", false);
return;
}
final ProgressHandle handle = ProgressHandleFactory.createHandle("Connecting to Facebook ...");
final Runnable task = new Runnable() {
@Override
public void run()
{
handle.start();
handle.switchToIndeterminate();
FacebookJsonRestClient client = new FacebookJsonRestClient(API_KEY, SECRET);
client.setIsDesktop(true);
HttpURLConnection connection;
List<String> cookies;
try {
String token = client.auth_createToken();
String post_url = "http://www.facebook.com/login.php";
String get_url = "http://www.facebook.com/login.php"
+ "?api_key=" + API_KEY
+ "&v=1.0"
+ "&auth_token=" + token;
HttpURLConnection.setFollowRedirects(true);
// get login
connection = (HttpURLConnection) new URL(get_url).openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401");
connection.setRequestProperty("Host", "www.facebook.com");
connection.setRequestProperty("Accept-Charset", "UFT-8");
connection.connect();
cookies = connection.getHeaderFields().get("Set-Cookie");
// post login
connection = (HttpURLConnection) new URL(post_url).openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401");
connection.setRequestProperty("Host", "www.facebook.com");
connection.setRequestProperty("Accept-Charset", "UFT-8");
if (cookies != null) {
for (String cookie : cookies) {
connection.addRequestProperty("Cookie", cookie.split(";", 2)[0]);
}
}
String params = "api_key=" + API_KEY
+ "&auth_token=" + token
+ "&email=" + URLEncoder.encode(email, "UTF-8")
+ "&pass=" + URLEncoder.encode(pass, "UTF-8")
+ "&v=1.0";
connection.setRequestProperty("Content-Length", Integer.toString(params.length()));
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setDoOutput(true);
connection.connect();
connection.getOutputStream().write(params.toString().getBytes("UTF-8"));
connection.getOutputStream().close();
cookies = connection.getHeaderFields().get("Set-Cookie");
if (cookies == null) {
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String url = "http://www.chartsy.org/facebook/";
DesktopUtil.browseAndWarn(url, null);
}
};
NotifyUtil.show(
"Application Permission",
"You need to grant permission first.",
MessageType.WARNING,
listener,
false);
connection.disconnect();
loggedIn = false;
} else {
sessionKey = client.auth_getSession(token);
sessionSecret = client.getSessionSecret();
loggedIn = true;
}
connection.disconnect();
handle.finish();
} catch (FacebookException fex) {
handle.finish();
NotifyUtil.error("Login Error", fex.getMessage(), fex, false);
} catch (IOException ioex) {
handle.finish();
NotifyUtil.error("Login Error", ioex.getMessage(), ioex, false);
}
}
};
WindowManager.getDefault().invokeWhenUIReady(task);
}
public void publishChart(final ChartFrame chartFrame, final String caption)
{
if (loggedIn) {
final ProgressHandle handle = ProgressHandleFactory.createHandle("Uploading chart image to wall ...");
final Runnable task = new Runnable()
{
@Override
public void run()
{
handle.start();
handle.switchToIndeterminate();
FacebookJsonRestClient client = new FacebookJsonRestClient(API_KEY, sessionSecret, sessionKey);
try {
File file = ImageExporter.getDefault().getExportedFile(chartFrame, getClass());
if (caption != null && !caption.isEmpty()) {
String text = caption;
text += "\n\n";
text += "Image generated by Chartsy.\nVisit us on www.chartsy.org.";
client.photos_upload(file, text);
} else {
String text = "Image generated by Chartsy.\nVisit us on www.chartsy.org.";
client.photos_upload(file, text);
}
NotifyUtil.info("Upload Done", "File uploaded successfully.", false);
} catch (FacebookException fex) {
NotifyUtil.error("Upload Error", fex.getMessage(), fex, false);
}
handle.finish();
}
};
WindowManager.getDefault().invokeWhenUIReady(task);
}
}
public PhotoCaptionPanel getPhotoCaptionPanel()
{
if (captionPanel == null)
{
captionPanel = new PhotoCaptionPanel();
}
captionPanel.reset();
return captionPanel;
}
public String getPhotoCaption()
{
if (captionPanel == null)
{
captionPanel = new PhotoCaptionPanel();
return "";
}
return captionPanel.getCaption();
}
public class PhotoCaptionPanel extends JPanel
{
private JLabel captionLbl;
private JTextPane captionTxt;
private JScrollPane captionSp;
public PhotoCaptionPanel()
{
super(new GridBagLayout());
setBorder(new TitledBorder("Photo Caption:"));
GridBagConstraints lastConstraints = new GridBagConstraints();
lastConstraints.fill = GridBagConstraints.HORIZONTAL;
lastConstraints.anchor = GridBagConstraints.NORTHWEST;
lastConstraints.weightx = 1.0;
lastConstraints.gridwidth = GridBagConstraints.REMAINDER;
lastConstraints.insets = new Insets(5, 5, 5, 5);
GridBagConstraints labelConstraints = (GridBagConstraints) lastConstraints.clone();
labelConstraints.weightx = 0.0;
labelConstraints.gridwidth = 1;
captionLbl = new JLabel("Caption:");
add(captionLbl, labelConstraints);
captionTxt = new JTextPane();
captionTxt.setPreferredSize(new Dimension(300, 200));
captionSp = new JScrollPane(captionTxt, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
add(captionSp, lastConstraints);
}
public void reset()
{
captionTxt.setText("");
}
public String getCaption()
{
return captionTxt.getText();
}
}
}