mobisocial.musubi.social.FacebookFriendFetcher.java Source code

Java tutorial

Introduction

Here is the source code for mobisocial.musubi.social.FacebookFriendFetcher.java

Source

/*
 * 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;
    }
}