/** * Copyright (c) 2014-present, Facebook, Inc. All rights reserved. * * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, * copy, modify, and distribute this software in source code or binary form for use * in connection with the web services and APIs provided by Facebook. * * As with any software that integrates with the Facebook platform, your use of * this software is subject to the Facebook Developer Principles and Policies * [http://developers.facebook.com/policy/]. This copyright notice shall be * included in all copies or substantial portions of the software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.example.switchuser; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.*; import android.widget.TextView; import com.facebook.AccessToken; import com.facebook.AccessTokenTracker; import com.facebook.CallbackManager; import com.facebook.Profile; import com.facebook.ProfileTracker; import com.facebook.login.widget.ProfilePictureView; public class ProfileFragment extends Fragment { public static final String TAG = "ProfileFragment"; private TextView userNameView; private ProfilePictureView profilePictureView; private OnOptionsItemSelectedListener onOptionsItemSelectedListener; private Profile pendingUpdateForUser; private CallbackManager callbackManager; private ProfileTracker profileTracker; private AccessTokenTracker accessTokenTracker; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); callbackManager = CallbackManager.Factory.create(); profileTracker = new ProfileTracker() { @Override protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) { setProfile(currentProfile); } }; accessTokenTracker = new AccessTokenTracker() { @Override protected void onCurrentAccessTokenChanged( AccessToken oldAccessToken, AccessToken currentAccessToken) { // On AccessToken changes fetch the new profile which fires the event on // the ProfileTracker if the profile is different Profile.fetchProfileForCurrentAccessToken(); } }; // Ensure that our profile is up to date Profile.fetchProfileForCurrentAccessToken(); setProfile(Profile.getCurrentProfile()); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.options_profile, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { boolean handled = false; OnOptionsItemSelectedListener listener = onOptionsItemSelectedListener; if (listener != null) { handled = listener.onOptionsItemSelected(item); } if (!handled) { handled = super.onOptionsItemSelected(item); } return handled; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_profile, parent, false); userNameView = (TextView) v.findViewById(R.id.profileUserName); profilePictureView = (ProfilePictureView) v.findViewById(R.id.profilePic); if (pendingUpdateForUser != null) { setProfile(pendingUpdateForUser); pendingUpdateForUser = null; } return v; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); callbackManager.onActivityResult(requestCode, resultCode, data); } @Override public void onDestroy() { super.onDestroy(); profileTracker.stopTracking(); accessTokenTracker.stopTracking(); } public void setOnOptionsItemSelectedListener(OnOptionsItemSelectedListener listener) { this.onOptionsItemSelectedListener = listener; } private void setProfile(Profile profile) { if (userNameView == null || profilePictureView == null || !isAdded()) { // Fragment not yet added to the view. So let's store which user was intended // for display. pendingUpdateForUser = profile; return; } if (profile == null) { profilePictureView.setProfileId(null); userNameView.setText(R.string.greeting_no_user); } else { profilePictureView.setProfileId(profile.getId()); userNameView.setText(String.format(getString(R.string.greeting_format), profile.getName())); } } public interface OnOptionsItemSelectedListener { boolean onOptionsItemSelected(MenuItem item); } }