////////////////////////////////////////////////////////////////////////////////////// // // Copyright 2012 Freshplanet (http://freshplanet.com | opensource@freshplanet.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.freshplanet.ane.AirFacebook; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.view.KeyEvent; import android.view.Window; import com.facebook.FacebookOperationCanceledException; import com.facebook.Session; import com.facebook.SessionState; public class LoginActivity extends Activity { public static String extraPrefix = "com.freshplanet.ane.AirFacebook.LoginActivity"; private Session.StatusCallback _statusCallback = new SessionStatusCallback(); private AirFacebookExtensionContext _context = null; private List<String> _permissions = null; private boolean _reauthorize = false; private Handler delayHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Retrieve context _context = AirFacebookExtension.context; if (_context == null) { AirFacebookExtension.log("Extension context is null"); finish(); return; } // Setup views requestWindowFeature(Window.FEATURE_LEFT_ICON); setContentView(_context.getResourceId("layout.com_facebook_login_activity_layout")); // Get extra values Bundle extras = this.getIntent().getExtras(); _permissions = new ArrayList<String>(Arrays.asList(extras.getStringArray(extraPrefix+".permissions"))); String type = extras.getString(extraPrefix+".type"); _reauthorize = extras.getBoolean(extraPrefix+".reauthorize", false); // Open or reauthorize session if necessary Session session = _context.getSession(); if (_reauthorize && !session.getPermissions().containsAll(_permissions)) { Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, _permissions).setCallback(_statusCallback); try { if ("read".equals(type)) { session.requestNewReadPermissions(newPermissionsRequest); } else { session.requestNewPublishPermissions(newPermissionsRequest); } } catch (Exception e) { finishLogin(e); return; } } else if (!session.isOpened()) { Session.OpenRequest openRequest = new Session.OpenRequest(this).setPermissions(_permissions).setCallback(_statusCallback); final Session finalSession = session; final Session.OpenRequest finalOpenRequest = openRequest; if (!session.getState().equals(SessionState.CREATED) && !session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) { _context.closeSessionAndClearTokenInformation(); session = _context.getSession(); } if(_context.usingStage3D) { try { delayHandler = new Handler(); if ("read".equals(type)) { delayHandler.postDelayed( new Runnable() { @Override public void run() { try { finalSession.openForRead(finalOpenRequest); } catch (Exception e) { finishLogin(e); } } }, 1 ); } else { delayHandler.postDelayed( new Runnable() { @Override public void run() { try { finalSession.openForPublish(finalOpenRequest); } catch (Exception e) { finishLogin(e); } } }, 1 ); } } catch (Exception e) { finishLogin(e); return; } } else { try { if("read".equals(type)) { finalSession.openForRead(finalOpenRequest); } else { finalSession.openForPublish(finalOpenRequest); } } catch (Exception e) { finishLogin(e); } } } else { finishLogin(); } } @Override public void onStart() { super.onStart(); if (_context != null) { _context.getSession().addCallback(_statusCallback); } } @Override public void onStop() { super.onStop(); if (_context != null) { _context.getSession().removeCallback(_statusCallback); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (_context != null) { _context.getSession().onActivityResult(this, requestCode, resultCode, data); } } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { onBackPressed(); return true; } return super.onKeyUp(keyCode, event); } @Override public void onBackPressed() { finishLogin(new FacebookOperationCanceledException()); } private class SessionStatusCallback implements Session.StatusCallback { @Override public void call(Session session, SessionState state, Exception exception) { if (_reauthorize || session.isOpened() || exception != null) { finishLogin(exception); } } } private void finishLogin(Exception exception) { if (exception != null) { exception.printStackTrace(); } if (_context == null) { AirFacebookExtension.log("Extension context is null"); finish(); return; } Session session = _context.getSession(); Boolean isCancel = (exception instanceof FacebookOperationCanceledException); String eventName = null; if (_reauthorize) { if (session.getPermissions().containsAll(_permissions)) { eventName = "REAUTHORIZE_SESSION_SUCCESS"; } else if (exception != null && !isCancel) { eventName = "REAUTHORIZE_SESSION_ERROR"; } else { eventName = "REAUTHORIZE_SESSION_CANCEL"; } } else { if (session.isOpened()) { eventName = "OPEN_SESSION_SUCCESS"; } else if (isCancel) { eventName = "OPEN_SESSION_CANCEL"; } else if (exception != null) { eventName = "OPEN_SESSION_ERROR"; } } String eventInfo = "OK"; if (exception != null) { exception.printStackTrace(); if (exception.getMessage() != null) { eventInfo = exception.getMessage(); } } if (eventName != null && eventInfo != null) { _context.dispatchStatusEventAsync(eventName, eventInfo); } finish(); } private void finishLogin() { finishLogin(null); } }