Android Open Source - CCSocialNetwork Session Tracker






From Project

Back to project page CCSocialNetwork.

License

The source code is released under:

GNU Lesser General Public License

If you think the Android project CCSocialNetwork listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/**
 * Copyright 2010-present Facebook.//from  www  .j a  va 2 s.  c om
 *
 * 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.internal;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import com.facebook.Session;
import com.facebook.SessionState;

/**
 * com.facebook.internal is solely for the use of other packages within the Facebook SDK for Android. Use of
 * any of the classes in this package is unsupported, and they may be modified or removed without warning at
 * any time.
 */
public class SessionTracker {

    private Session session;
    private final Session.StatusCallback callback;
    private final BroadcastReceiver receiver;
    private final LocalBroadcastManager broadcastManager;
    private boolean isTracking = false;

    /**
     * Constructs a SessionTracker to track the active Session object.
     * 
     * @param context the context object.
     * @param callback the callback to use whenever the active Session's 
     *                 state changes
     */
    public SessionTracker(Context context, Session.StatusCallback callback) {
        this(context, callback, null);
    }
    
    /**
     * Constructs a SessionTracker to track the Session object passed in.
     * If the Session is null, then it will track the active Session instead.
     * 
     * @param context the context object.
     * @param callback the callback to use whenever the Session's state changes
     * @param session the Session object to track
     */
    SessionTracker(Context context, Session.StatusCallback callback, Session session) {
        this(context, callback, session, true);
    }
    
    /**
     * Constructs a SessionTracker to track the Session object passed in.
     * If the Session is null, then it will track the active Session instead.
     * 
     * @param context the context object.
     * @param callback the callback to use whenever the Session's state changes
     * @param session the Session object to track
     * @param startTracking whether to start tracking the Session right away
     */
    public SessionTracker(Context context, Session.StatusCallback callback, Session session, boolean startTracking) {
        this.callback = new CallbackWrapper(callback);
        this.session = session;
        this.receiver = new ActiveSessionBroadcastReceiver();
        this.broadcastManager = LocalBroadcastManager.getInstance(context);

        if (startTracking) {
            startTracking();
        }
    }

    /**
     * Returns the current Session that's being tracked.
     * 
     * @return the current Session associated with this tracker
     */
    public Session getSession() {
        return (session == null) ? Session.getActiveSession() : session;
    }

    /**
     * Returns the current Session that's being tracked if it's open, 
     * otherwise returns null.
     * 
     * @return the current Session if it's open, otherwise returns null
     */
    public Session getOpenSession() {
        Session openSession = getSession();
        if (openSession != null && openSession.isOpened()) {
            return openSession;
        }
        return null;
    }

    /**
     * Set the Session object to track.
     * 
     * @param newSession the new Session object to track
     */
    public void setSession(Session newSession) {
        if (newSession == null) {
            if (session != null) {
                // We're current tracking a Session. Remove the callback
                // and start tracking the active Session.
                session.removeCallback(callback);
                session = null;
                addBroadcastReceiver();
                if (getSession() != null) {
                    getSession().addCallback(callback);
                }
            }
        } else {
            if (session == null) {
                // We're currently tracking the active Session, but will be
                // switching to tracking a different Session object.
                Session activeSession = Session.getActiveSession();
                if (activeSession != null) {
                    activeSession.removeCallback(callback);
                }
                broadcastManager.unregisterReceiver(receiver);
            } else {
                // We're currently tracking a Session, but are now switching 
                // to a new Session, so we remove the callback from the old 
                // Session, and add it to the new one.
                session.removeCallback(callback);
            }
            session = newSession;
            session.addCallback(callback);
        }
    }

    /**
     * Start tracking the Session (either active or the one given). 
     */
    public void startTracking() {
        if (isTracking) {
            return;
        }
        if (this.session == null) {
            addBroadcastReceiver();
        }        
        // if the session is not null, then add the callback to it right away
        if (getSession() != null) {
            getSession().addCallback(callback);
        }
        isTracking = true;
    }

    /**
     * Stop tracking the Session and remove any callbacks attached
     * to those sessions.
     */
    public void stopTracking() {
        if (!isTracking) {
            return;
        }
        Session session = getSession();
        if (session != null) {
            session.removeCallback(callback);
        }
        broadcastManager.unregisterReceiver(receiver);
        isTracking = false;
    }
    
    /**
     * Returns whether it's currently tracking the Session.
     * 
     * @return true if currently tracking the Session
     */
    public boolean isTracking() {
        return isTracking;
    }

    /**
     * Returns whether it's currently tracking the active Session.
     *
     * @return true if the currently tracked session is the active Session.
     */
    public boolean isTrackingActiveSession() {
        return session == null;
    }
    
    private void addBroadcastReceiver() {
        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);
    }

    /**
     * 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) {
                    session.addCallback(SessionTracker.this.callback);
                }
            }
        }
    }

    private class CallbackWrapper implements Session.StatusCallback {

        private final Session.StatusCallback wrapped;
        public CallbackWrapper(Session.StatusCallback wrapped) {
            this.wrapped = wrapped;
        }

        @Override
        public void call(Session session, SessionState state, Exception exception) {
            if (wrapped != null && isTracking()) {
                wrapped.call(session, state, exception);
            }
            // if we're not tracking the Active Session, and the current session
            // is closed, then start tracking the Active Session.
            if (session == SessionTracker.this.session && state.isClosed()) {
                setSession(null);
            }
        }
    }
}




Java Source Code List

com.facebook.AccessTokenSource.java
com.facebook.AccessToken.java
com.facebook.AuthorizationClient.java
com.facebook.FacebookAuthorizationException.java
com.facebook.FacebookDialogException.java
com.facebook.FacebookException.java
com.facebook.FacebookGraphObjectException.java
com.facebook.FacebookOperationCanceledException.java
com.facebook.FacebookRequestError.java
com.facebook.FacebookSdkVersion.java
com.facebook.FacebookServiceException.java
com.facebook.GetTokenClient.java
com.facebook.HttpMethod.java
com.facebook.InsightsLogger.java
com.facebook.LegacyHelper.java
com.facebook.LoggingBehavior.java
com.facebook.LoginActivity.java
com.facebook.NativeProtocol.java
com.facebook.NonCachingTokenCachingStrategy.java
com.facebook.RequestAsyncTask.java
com.facebook.RequestBatch.java
com.facebook.Request.java
com.facebook.Response.java
com.facebook.SessionDefaultAudience.java
com.facebook.SessionLoginBehavior.java
com.facebook.SessionState.java
com.facebook.Session.java
com.facebook.Settings.java
com.facebook.SharedPreferencesTokenCachingStrategy.java
com.facebook.TestSession.java
com.facebook.TokenCachingStrategy.java
com.facebook.UiLifecycleHelper.java
com.facebook.android.AsyncFacebookRunner.java
com.facebook.android.DialogError.java
com.facebook.android.FacebookError.java
com.facebook.android.Facebook.java
com.facebook.android.FbDialog.java
com.facebook.android.Util.java
com.facebook.internal.CacheableRequestBatch.java
com.facebook.internal.FileLruCache.java
com.facebook.internal.Logger.java
com.facebook.internal.ServerProtocol.java
com.facebook.internal.SessionAuthorizationType.java
com.facebook.internal.SessionTracker.java
com.facebook.internal.Utility.java
com.facebook.internal.Validate.java
com.facebook.internal.package-info.java
com.facebook.model.GraphLocation.java
com.facebook.model.GraphMultiResult.java
com.facebook.model.GraphObjectList.java
com.facebook.model.GraphObject.java
com.facebook.model.GraphPlace.java
com.facebook.model.GraphUser.java
com.facebook.model.JsonUtil.java
com.facebook.model.OpenGraphAction.java
com.facebook.model.PropertyName.java
com.facebook.widget.FacebookFragment.java
com.facebook.widget.FriendPickerFragment.java
com.facebook.widget.GraphObjectAdapter.java
com.facebook.widget.GraphObjectCursor.java
com.facebook.widget.GraphObjectPagingLoader.java
com.facebook.widget.ImageDownloader.java
com.facebook.widget.ImageRequest.java
com.facebook.widget.ImageResponseCache.java
com.facebook.widget.ImageResponse.java
com.facebook.widget.LoginButton.java
com.facebook.widget.PickerFragment.java
com.facebook.widget.PlacePickerFragment.java
com.facebook.widget.ProfilePictureView.java
com.facebook.widget.SimpleGraphObjectCursor.java
com.facebook.widget.UrlRedirectCache.java
com.facebook.widget.UserSettingsFragment.java
com.facebook.widget.WebDialog.java
com.facebook.widget.WorkQueue.java
org.example.SocialNetwork.CCSocialNetwork.java
org.example.SocialNetwork.EmailSender.java
org.example.SocialNetwork.InternetConnection.java