/*
* Copyright 2012 Javier Pérez Pacheco and Francisco Díaz Rodriguez
* TweetTopics 2.0
* javielinux@gmail.com
*
* 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.javielinux.facebook;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.WebView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import com.android.dataframework.DataFramework;
import com.android.dataframework.Entity;
import com.facebook.android.AsyncFacebookRunner;
import com.facebook.android.DialogError;
import com.facebook.android.Facebook;
import com.facebook.android.Facebook.DialogListener;
import com.facebook.android.FacebookError;
import com.javielinux.fragments.MyActivityFragment;
import com.javielinux.utils.ImageUtils;
import com.javielinux.utils.Utils;
import org.json.JSONObject;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
public class FacebookHandler {
public static final String FB_APP_ID = "213237322060541";
private WebView mWebView;
boolean isWebViewShown;
private MyActivityFragment myActivityFragment = null;
private Activity activity;
LinearLayout layout;
private static String[] PERMISSIONS =
new String[] { "offline_access", "read_stream", "publish_stream" };
public FacebookHandler(Activity activity) {
if (activity!=null) {
this.activity = activity;
layout = new LinearLayout(activity);
activity.addContentView(
layout, new LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
isWebViewShown = false;
}
}
public void setMyActivityFragment(MyActivityFragment myActivityFragment) {
this.myActivityFragment = myActivityFragment;
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0) {
if (myActivityFragment!=null) {
myActivityFragment.fillData();
}
}
}
};
public void newUser() {
showWebView();
new JsHandler().login();
}
public Facebook loadUser(long id) {
try {
DataFramework.getInstance().open(getActivity(), Utils.packageName);
} catch (Exception e) {
e.printStackTrace();
}
Entity ent = DataFramework.getInstance().getTopEntity("users", DataFramework.KEY_ID + " = " + id, "");
if (ent!=null) {
Facebook fb = new Facebook(FB_APP_ID);
fb.setAccessToken(ent.getString("token_facebook"));
fb.setAccessExpires(ent.getLong("expires_facebook"));
if (fb.isSessionValid()) {
return fb;
} else {
return null;
}
}
DataFramework.getInstance().close();
return null;
}
public void showWebView() {
if (isWebViewShown) {
return;
}
CookieSyncManager.createInstance(activity);
mWebView = new WebView(activity);
layout.addView(mWebView,
new LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
CookieManager.getInstance().removeAllCookie();
CookieManager.getInstance().removeExpiredCookie();
CookieManager.getInstance().removeSessionCookie();
CookieSyncManager.getInstance().sync();
isWebViewShown = true;
}
public void hideWebView() {
layout.removeView(mWebView);
isWebViewShown = false;
}
public Activity getActivity() {
return activity;
}
public boolean isWebViewShown() {
return isWebViewShown;
}
private class JsHandler {
public void login() {
final Activity activity = FacebookHandler.this.getActivity();
activity.runOnUiThread(new Runnable() {
public void run() {
hideWebView();
try {
final Facebook fb = new Facebook(FB_APP_ID);
fb.authorize(getActivity(), PERMISSIONS,
new AppLoginListener(fb));
} catch (Exception e) {
Log.d(Utils.TAG, "values: " + e.getMessage());
}
}
});
}
private class AppLoginListener implements DialogListener {
private Facebook fb;
public AppLoginListener(Facebook fb) {
this.fb = fb;
}
public void saveUser(String uid, String name, String username) {
try {
DataFramework.getInstance().open(getActivity(), Utils.packageName);
} catch (Exception e) {
e.printStackTrace();
}
name = name.replace("'", "");
if (DataFramework.getInstance().getTopEntity("users", "name = '" + name + "'", "")==null) {
Entity ent = new Entity("users");
ent.setValue("name", name);
ent.setValue("service", "facebook");
ent.setValue("uid_facebook", uid);
ent.setValue("username_facebook", username);
ent.setValue("expires_facebook", Utils.fillZeros(fb.getAccessExpires()+""));
ent.setValue("token_facebook", fb.getAccessToken());
ent.save();
try {
URL url = new URL("http://graph.facebook.com/"+username+"/picture");
Bitmap avatar = BitmapFactory.decodeStream(new Utils.FlushedInputStream(url.openStream()));
if (avatar!=null) {
String file = ImageUtils.getFileAvatar(ent.getId());
FileOutputStream out = new FileOutputStream(file);
avatar.compress(Bitmap.CompressFormat.JPEG, 90, out);
avatar.recycle();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
DataFramework.getInstance().close();
handler.sendEmptyMessage(0);
}
public void onCancel() {
Log.d(Utils.TAG, "login canceled");
}
public void onComplete(Bundle values) {
new AsyncFacebookRunner(fb).request("/me",
new AsyncRequestListener() {
public void onComplete(JSONObject obj, final Object state) {
Log.d(Utils.TAG, "obj: " + obj.toString());
String uid = obj.optString("id");
String name = obj.optString("name");
String username = obj.optString("username");
saveUser(uid, name, username);
}
}, null);
}
public void onError(DialogError e) {
Log.d(Utils.TAG, "dialog error: " + e);
}
public void onFacebookError(FacebookError e) {
Log.d(Utils.TAG, "facebook error: " + e);
}
}
}
/*
private class AppWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("app://")) {
String handlerName = url.substring(6);
Log.d("app", "ejecutar " + handlerName);
//runHandler(handlerName);
return true;
}
return false;
}
}
*/
}