/* * Copyright 2012 The Stanford MobiSocial Laboratory * * 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 mobisocial.musubi.social; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import org.apache.http.util.ByteArrayBuffer; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.os.Bundle; import android.util.Log; import com.facebook.android.Facebook; import com.facebook.android.FacebookError; import com.facebook.android.Util; public class FacebookFriendFetcher { public static final String TAG = "FacebookFriendFetch"; static final boolean DBG = false; private static final int CHUNK_SIZE = 100; private static final int NUM_RETRIES = 3; private final Facebook mFacebook; private JSONObject mUserInfo = null; public FacebookFriendFetcher(Facebook facebook) { mFacebook = facebook; } /* * Get a list of friends' uids, names, and profile picture URLs updated after lastUpdateTime */ public JSONArray getFriendInfo() throws Exception { try { // Ask for friend information as FQL // This query gets the user id, full name, and small profile picture // of all of the logged-in user's friends (and the user himself) if (mFacebook.isSessionValid()) { Bundle params = new Bundle(); params.putString("q", "SELECT uid, name, pic_square FROM user " + "WHERE uid = me() OR uid in (SELECT uid2 FROM friend WHERE uid1 = me())"); JSONObject data = Util.parseJson(mFacebook.request("fql", params)); if (DBG) Log.d(TAG, data.toString()); return data.getJSONArray("data"); } } catch (FacebookError e) { Log.e(TAG, "Facebook request error", e); } return null; } private JSONObject sendFacebookRequestWithRetries(String location) throws IOException { if (mFacebook.isSessionValid()) { for (int i = 0; i < NUM_RETRIES; i++) { try { JSONObject result = Util.parseJson(mFacebook.request(location)); if (result != null) { return result; } } catch (Throwable e) { Log.e(TAG, "Facebook request error, e"); } } } throw new IOException(); } /* * Get current logged in user's Facebook login email */ public String getLoggedinUserEmail() { String email = null; if(mUserInfo == null) { try { if(mFacebook.isSessionValid()) { mUserInfo = sendFacebookRequestWithRetries("/me"); email = mUserInfo.getString("email"); } } catch (Throwable e) { Log.w(TAG, "Facebook request error, couldn't get email"); } } else { try { email = mUserInfo.getString("email"); } catch (JSONException e) { Log.w(TAG, "Facebook request error, couldn't find email"); } } return email; } /* * Get current logged in user's Facebook id */ public String getLoggedinUserId() { String id = null; if(mUserInfo == null) { try { if(mFacebook.isSessionValid()) { mUserInfo = sendFacebookRequestWithRetries("/me"); id = mUserInfo.getString("id"); } } catch (Throwable e) { Log.e(TAG, "Facebook request error", e); } } else { try { id = mUserInfo.getString("id"); } catch (JSONException e) { Log.e(TAG, "Facebook request error", e); } } return id; } /* * Get current logged in user's Facebook name */ public String getLoggedinUserName() { String name = null; if(mUserInfo == null) { try { if(mFacebook.isSessionValid()) { mUserInfo = sendFacebookRequestWithRetries("/me"); name = mUserInfo.getString("name"); } } catch (Throwable e) { Log.e(TAG, "Facebook request error", e); } } else { try { name = mUserInfo.getString("name"); } catch (JSONException e) { Log.e(TAG, "Facebook request error", e); } } return name; } /* * Get current logged in user's Facebook profile picture */ public byte[] getLoggedinUserPhoto() { if(mFacebook.isSessionValid()) { Bundle params = new Bundle(); params.putString("access_token", mFacebook.getAccessToken()); String url = "https://graph.facebook.com/me/picture" + "?" + Util.encodeUrl(params); return getImageFromURL(url); } return null; } /* * Given a URL, return a byte array representing the data */ public static byte[] getImageFromURL(String remoteUrl) { try { // Grab the content URL url = new URL(remoteUrl); URLConnection ucon = url.openConnection(); InputStream is = ucon.getInputStream(); // Read the content chunk by chunk BufferedInputStream bis = new BufferedInputStream(is, 8192); ByteArrayBuffer baf = new ByteArrayBuffer(0); byte[] chunk = new byte[CHUNK_SIZE]; int current = bis.read(chunk); while (current != -1) { baf.append(chunk, 0, current); current = bis.read(chunk); } return baf.toByteArray(); } catch (IOException e) { Log.e(TAG, "HTTP error", e); } return null; } }