/** * 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.facebook.login; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.facebook.R; /** * This Fragment is a necessary part of the overall Facebook login process * but is not meant to be used directly. * * @see com.facebook.FacebookActivity */ public class LoginFragment extends Fragment { static final String RESULT_KEY = "com.facebook.LoginFragment:Result"; static final String REQUEST_KEY = "com.facebook.LoginFragment:Request"; static final String EXTRA_REQUEST = "request"; private static final String TAG = "LoginFragment"; private static final String NULL_CALLING_PKG_ERROR_MSG = "Cannot call LoginFragment with a null calling package. " + "This can occur if the launchMode of the caller is singleInstance."; private static final String SAVED_LOGIN_CLIENT = "loginClient"; private String callingPackage; private LoginClient loginClient; private LoginClient.Request request; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { loginClient = savedInstanceState.getParcelable(SAVED_LOGIN_CLIENT); loginClient.setFragment(this); } else { loginClient = createLoginClient(); } loginClient.setOnCompletedListener(new LoginClient.OnCompletedListener() { @Override public void onCompleted(LoginClient.Result outcome) { onLoginClientCompleted(outcome); } }); Activity activity = getActivity(); if (activity == null) { return; } initializeCallingPackage(activity); if (activity.getIntent() != null) { Intent intent = activity.getIntent(); Bundle bundle = intent.getBundleExtra(REQUEST_KEY); request = bundle.getParcelable(EXTRA_REQUEST); } } protected LoginClient createLoginClient() { return new LoginClient(this); } @Override public void onDestroy() { loginClient.cancelCurrentHandler(); super.onDestroy(); } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.com_facebook_login_fragment, container, false); loginClient.setBackgroundProcessingListener( new LoginClient.BackgroundProcessingListener() { @Override public void onBackgroundProcessingStarted() { view.findViewById(R.id.com_facebook_login_activity_progress_bar) .setVisibility(View.VISIBLE); } @Override public void onBackgroundProcessingStopped() { view.findViewById(R.id.com_facebook_login_activity_progress_bar) .setVisibility(View.GONE); } }); return view; } private void onLoginClientCompleted(LoginClient.Result outcome) { request = null; int resultCode = (outcome.code == LoginClient.Result.Code.CANCEL) ? Activity.RESULT_CANCELED : Activity.RESULT_OK; Bundle bundle = new Bundle(); bundle.putParcelable(RESULT_KEY, outcome); Intent resultIntent = new Intent(); resultIntent.putExtras(bundle); // The activity might be detached we will send a cancel result in onDetach if (isAdded()) { getActivity().setResult(resultCode, resultIntent); getActivity().finish(); } } @Override public void onResume() { super.onResume(); // If the calling package is null, this generally means that the callee was started // with a launchMode of singleInstance. Unfortunately, Android does not allow a result // to be set when the callee is a singleInstance, so we log an error and return. if (callingPackage == null) { Log.e(TAG, NULL_CALLING_PKG_ERROR_MSG); getActivity().finish(); return; } loginClient.startOrContinueAuth(request); } @Override public void onPause() { super.onPause(); getActivity().findViewById(R.id.com_facebook_login_activity_progress_bar).setVisibility( View.GONE); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); loginClient.onActivityResult(requestCode, resultCode, data); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(SAVED_LOGIN_CLIENT, loginClient); } private void initializeCallingPackage(final Activity activity) { ComponentName componentName = activity.getCallingActivity(); if (componentName == null) { return; } callingPackage = componentName.getPackageName(); } LoginClient getLoginClient() { return loginClient; } }