/*
* Copyright 2012 Feedlr
*
* 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.chalmers.feedlr.client;
import com.chalmers.feedlr.listener.AuthListener;
import com.chalmers.feedlr.util.ClientStore;
import com.facebook.android.DialogError;
import com.facebook.android.Facebook;
import com.facebook.android.FacebookError;
import com.facebook.android.Facebook.DialogListener;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
/**
* Class description
*
* @author Daniel Larsson
*
* This class provides help methods for Facebook authorization.
*/
public class FacebookAuthHelper {
private Context context;
private Facebook facebook;
private AuthListener authListener;
public FacebookAuthHelper(Context context) {
this.context = context;
facebook = Clients.getFacebook();
facebook.extendAccessTokenIfNeeded(context, null);
if (ClientStore.getFacebookAccessToken(context) != null) {
authorize(new AuthListener() {
@Override
public void onAuthorizationComplete() {
}
@Override
public void onAuthorizationFail() {
}
});
}
setAccessToken();
}
/**
* Looks for an access token in <code>ClientStore</code> and, if there is
* one, applies it to this session. Also sets expiration time of the token.
*/
public void setAccessToken() {
String accessToken = ClientStore.getFacebookAccessToken(context);
Long accessTokenExpires = ClientStore
.getFacebookAccessTokenExpires(context);
if (accessToken != null) {
facebook.setAccessToken(accessToken);
}
if (accessTokenExpires != 0) {
facebook.setAccessExpires(accessTokenExpires);
}
}
/**
* Authorizes the session, if is not authorized.
*
* @param listener
* the listener to be used in the authorization request
*/
public void authorize(AuthListener listener) {
authListener = listener;
setAccessToken();
if (!Clients.isAuthorized(Clients.FACEBOOK, context)) {
facebook.authorize((Activity) context, new String[] {
"read_stream", "read_friendlists" },
Facebook.FORCE_DIALOG_AUTH,
new DialogListener() {
@Override
public void onComplete(Bundle values) {
ClientStore.saveFacebookAccessToken(facebook,
context);
ClientStore.saveFacebookAccessTokenExpires(
facebook, context);
}
@Override
public void onFacebookError(FacebookError error) {
}
@Override
public void onError(DialogError e) {
}
@Override
public void onCancel() {
}
});
}
authListener.onAuthorizationComplete();
}
public void authorizeCallback(int requestCode, int resultCode, Intent data) {
facebook.authorizeCallback(requestCode, resultCode, data);
}
/**
* Uses variable shouldExtendAccessToken in
* <code>com.facebook.android.Facebook</code> to validate if the access
* token used is out dated. If so, the method will call
* <code>extendAccessToken</code>
*/
public void extendTokenIfNeeded() {
if (!facebook.extendAccessTokenIfNeeded(context, null)) {
ClientStore.saveFacebookAccessToken(facebook, context);
ClientStore.saveFacebookAccessTokenExpires(facebook, context);
}
}
public void onAuthCallback(int requestCode, int resultCode, Intent data) {
authorizeCallback(requestCode, resultCode, data);
}
}