/** * Copyright 2012 Facebook * * 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.facebook; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; /** * This class helps to create, automatically open (if applicable), save, and * restore the Active Session in a way that is similar to Android UI lifecycles. * <p> * When using this class, clients MUST call all the public methods from the * respective methods in either an Activity or Fragment. Failure to call all the * methods can result in improperly initialized or uninitialized Sessions. */ public class UiLifecycleHelper { private final static String ACTIVITY_NULL_MESSAGE = "activity cannot be null"; private final Activity activity; private final Session.StatusCallback callback; private final BroadcastReceiver receiver; private final LocalBroadcastManager broadcastManager; /** * Creates a new UiLifecycleHelper. * * @param activity the Activity associated with the helper. If calling from a Fragment, * use {@link android.support.v4.app.Fragment#getActivity()} * @param callback the callback for Session status changes, can be null */ public UiLifecycleHelper(Activity activity, Session.StatusCallback callback) { if (activity == null) { throw new IllegalArgumentException(ACTIVITY_NULL_MESSAGE); } this.activity = activity; this.callback = callback; this.receiver = new ActiveSessionBroadcastReceiver(); this.broadcastManager = LocalBroadcastManager.getInstance(activity); } /** * To be called from an Activity or Fragment's onCreate method. * * @param savedInstanceState the previously saved state */ public void onCreate(Bundle savedInstanceState) { Session session = Session.getActiveSession(); if (session == null) { if (savedInstanceState != null) { session = Session.restoreSession(activity, null, callback, savedInstanceState); } if (session == null) { session = new Session(activity); } Session.setActiveSession(session); } // add the broadcast receiver IntentFilter filter = new IntentFilter(); filter.addAction(Session.ACTION_ACTIVE_SESSION_SET); filter.addAction(Session.ACTION_ACTIVE_SESSION_UNSET); // Add a broadcast receiver to listen to when the active Session // is set or unset, and add/remove our callback as appropriate broadcastManager.registerReceiver(receiver, filter); } /** * To be called from an Activity or Fragment's onResume method. */ public void onResume() { Session session = Session.getActiveSession(); if (session != null) { if (callback != null) { session.addCallback(callback); } if (SessionState.CREATED_TOKEN_LOADED.equals(session.getState())) { session.openForRead(null); } } } /** * To be called from an Activity or Fragment's onActivityResult method. * * @param requestCode the request code * @param resultCode the result code * @param data the result data */ public void onActivityResult(int requestCode, int resultCode, Intent data) { Session session = Session.getActiveSession(); if (session != null) { session.onActivityResult(activity, requestCode, resultCode, data); } } /** * To be called from an Activity or Fragment's onSaveInstanceState method. * * @param outState the bundle to save state in */ public void onSaveInstanceState(Bundle outState) { Session.saveSession(Session.getActiveSession(), outState); } /** * To be called from an Activity or Fragment's onPause method. */ public void onPause() { if (callback != null) { Session session = Session.getActiveSession(); if (session != null) { session.removeCallback(callback); } } } /** * To be called from an Activity or Fragment's onDestroy method. */ public void onDestroy() { // remove the broadcast receiver broadcastManager.unregisterReceiver(receiver); } /** * The BroadcastReceiver implementation that either adds or removes the callback * from the active Session object as it's SET or UNSET. */ private class ActiveSessionBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Session.ACTION_ACTIVE_SESSION_SET.equals(intent.getAction())) { Session session = Session.getActiveSession(); if (session != null && callback != null) { session.addCallback(callback); } } else if (Session.ACTION_ACTIVE_SESSION_UNSET.equals(intent.getAction())) { Session session = Session.getActiveSession(); if (session != null && callback != null) { session.removeCallback(callback); } } } } }