The Facebook Login module provides comprehensive user authentication capabilities with multiple login methods, customizable UI components, and robust session management. It supports various login behaviors and handles permission requests seamlessly.
The LoginManager is the core class for handling Facebook login flows programmatically.
class LoginManager {
companion object {
fun getInstance(): LoginManager
}
// Login methods
fun logIn(activity: Activity, permissions: Collection<String>)
fun logIn(activity: Activity, permissions: Collection<String>, loggerID: String?)
fun logIn(fragment: Fragment, permissions: Collection<String>)
fun logIn(fragment: Fragment, permissions: Collection<String>, loggerID: String?)
fun logOut()
// Callback management
fun registerCallback(
callbackManager: CallbackManager,
callback: FacebookCallback<LoginResult>
)
fun unregisterCallback(callbackManager: CallbackManager)
// Configuration
fun setDefaultAudience(defaultAudience: DefaultAudience)
fun getDefaultAudience(): DefaultAudience
fun setLoginBehavior(loginBehavior: LoginBehavior)
fun getLoginBehavior(): LoginBehavior
fun setLoginTargetApp(targetApp: LoginTargetApp)
fun getLoginTargetApp(): LoginTargetApp
fun setAuthType(authType: String)
fun getAuthType(): String
// Login status
fun retrieveLoginStatus(
context: Context,
responseCallback: LoginStatusCallback
)
}
enum class LoginBehavior {
NATIVE_WITH_FALLBACK, // Try native app, fallback to web
NATIVE_ONLY, // Only native app
WEB_ONLY, // Only web
WEB_VIEW_ONLY, // Only WebView
KATANA_ONLY, // Only Facebook app
DIALOG_ONLY // Only dialog
}
enum class LoginTargetApp {
FACEBOOK,
INSTAGRAM
}
enum class DefaultAudience {
ONLY_ME, // Only the user
FRIENDS, // User's friends
EVERYONE // Public
}
interface LoginStatusCallback {
fun onCompleted(accessToken: AccessToken?)
fun onFailure()
fun onError(exception: Exception)
}class LoginActivity : AppCompatActivity() {
private lateinit var callbackManager: CallbackManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
callbackManager = CallbackManager.Factory.create()
val loginManager = LoginManager.getInstance()
// Configure login behavior
loginManager.setLoginBehavior(LoginBehavior.NATIVE_WITH_FALLBACK)
loginManager.setDefaultAudience(DefaultAudience.FRIENDS)
// Register callback
loginManager.registerCallback(callbackManager, object : FacebookCallback<LoginResult> {
override fun onSuccess(result: LoginResult) {
val accessToken = result.accessToken
val permissions = result.recentlyGrantedPermissions
Log.d("Login", "Login successful for user: ${accessToken.userId}")
}
override fun onCancel() {
Log.d("Login", "Login cancelled")
}
override fun onError(error: FacebookException) {
Log.e("Login", "Login error: ${error.message}")
}
})
// Perform login with permissions
loginManager.logIn(this, listOf("email", "public_profile", "user_friends"))
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
callbackManager.onActivityResult(requestCode, resultCode, data)
super.onActivityResult(requestCode, resultCode, data)
}
}The LoginButton provides a ready-to-use UI component that handles the complete login flow.
class LoginButton : FacebookButtonBase {
// Text properties
var loginText: String?
var logoutText: String?
// Permission configuration
var permissions: List<String>
fun setPermissions(vararg permissions: String?)
fun setReadPermissions(permissions: List<String>)
fun setReadPermissions(vararg permissions: String?)
fun setPublishPermissions(permissions: List<String>)
fun setPublishPermissions(vararg permissions: String?)
fun clearPermissions()
// Login configuration
var defaultAudience: DefaultAudience
var loginBehavior: LoginBehavior
var loginTargetApp: LoginTargetApp
var authType: String
var messengerPageId: String?
var resetMessengerState: Boolean
val shouldSkipAccountDeduplication: Boolean
// Tooltip configuration
var toolTipMode: ToolTipMode
var toolTipStyle: ToolTipPopup.Style
var toolTipDisplayTime: Long
fun dismissToolTip()
// Callback management
fun registerCallback(
callbackManager: CallbackManager,
callback: FacebookCallback<LoginResult>
)
fun unregisterCallback(callbackManager: CallbackManager)
enum class ToolTipMode {
AUTOMATIC, // Server determines tooltip display
DISPLAY_ALWAYS, // Always show tooltip
NEVER_DISPLAY // Never show tooltip
}
}class MainActivity : AppCompatActivity() {
private lateinit var callbackManager: CallbackManager
private lateinit var loginButton: LoginButton
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
callbackManager = CallbackManager.Factory.create()
loginButton = findViewById(R.id.login_button)
// Configure login button
loginButton.setPermissions("email", "public_profile")
loginButton.loginBehavior = LoginBehavior.NATIVE_WITH_FALLBACK
loginButton.defaultAudience = DefaultAudience.FRIENDS
// Set custom text
loginButton.loginText = "Continue with Facebook"
loginButton.logoutText = "Sign Out"
// Register callback
loginButton.registerCallback(callbackManager, object : FacebookCallback<LoginResult> {
override fun onSuccess(result: LoginResult) {
updateUI(true)
loadUserProfile()
}
override fun onCancel() {
Log.d("Login", "Login cancelled")
}
override fun onError(error: FacebookException) {
Log.e("Login", "Login error: ${error.message}")
updateUI(false)
}
})
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
callbackManager.onActivityResult(requestCode, resultCode, data)
super.onActivityResult(requestCode, resultCode, data)
}
}data class LoginResult(
val accessToken: AccessToken,
val recentlyGrantedPermissions: Set<String>,
val recentlyDeniedPermissions: Set<String>
)For devices without a web browser or limited input capabilities:
class DeviceLoginManager {
companion object {
fun getInstance(): DeviceLoginManager
}
fun startLogin(activity: Activity, permissions: Collection<String>)
fun loadDeviceLoginInfo(
deviceLoginInfoCallback: DeviceLoginInfoCallback
)
interface DeviceLoginInfoCallback {
fun onSuccess(deviceLoginInfo: DeviceLoginInfo)
fun onError(ex: FacebookException)
}
}
class DeviceLoginButton : FacebookButtonBase {
var permissions: List<String>
var defaultAudience: DefaultAudience
var redirectUri: Uri?
fun setPermissions(vararg permissions: String?)
fun registerCallback(
callbackManager: CallbackManager,
callback: FacebookCallback<LoginResult>
)
}
data class DeviceLoginInfo(
val userCode: String,
val verificationUri: String,
val interval: Long,
val expiresIn: Long
)A UI component for displaying user profile pictures:
class ProfilePictureView : View {
var profileId: String?
var isCropped: Boolean
var presetSize: Int
companion object {
const val SMALL = -4
const val NORMAL = -3
const val LARGE = -2
const val CUSTOM = -1
}
interface OnErrorListener {
fun onError(error: FacebookException)
}
fun setOnErrorListener(onErrorListener: OnErrorListener?)
}// In your layout
val profilePictureView: ProfilePictureView = findViewById(R.id.profile_picture)
// Set the profile ID (user ID)
profilePictureView.profileId = AccessToken.getCurrentAccessToken()?.userId
// Configure appearance
profilePictureView.isCropped = true
profilePictureView.presetSize = ProfilePictureView.LARGE
// Handle errors
profilePictureView.setOnErrorListener { error ->
Log.e("ProfilePicture", "Error loading profile picture: ${error.message}")
}Track changes to the current access token:
abstract class AccessTokenTracker {
val isTracking: Boolean
fun startTracking()
fun stopTracking()
protected abstract fun onCurrentAccessTokenChanged(
oldAccessToken: AccessToken?,
currentAccessToken: AccessToken?
)
}class MyAccessTokenTracker : AccessTokenTracker() {
override fun onCurrentAccessTokenChanged(
oldAccessToken: AccessToken?,
currentAccessToken: AccessToken?
) {
if (currentAccessToken == null) {
// User logged out
clearUserData()
showLoginScreen()
} else {
// User logged in or token refreshed
loadUserData()
}
}
}
// Start tracking in your Application or Activity
val tokenTracker = MyAccessTokenTracker()
tokenTracker.startTracking()
// Don't forget to stop tracking when appropriate
tokenTracker.stopTracking()Advanced login configuration options:
val loginManager = LoginManager.getInstance()
// Set authentication type
loginManager.setAuthType("rerequest") // or "reauth"
// Configure for Messenger integration
loginManager.setMessengerPageId("your-page-id")
loginManager.setResetMessengerState(true)
// Set target app for Family of Apps login
loginManager.setLoginTargetApp(LoginTargetApp.INSTAGRAM)
// Family login configuration (advanced)
loginManager.setFamilyLogin(true)
loginManager.setShouldSkipAccountDeduplication(true)Common login errors and how to handle them:
override fun onError(error: FacebookException) {
when (error) {
is FacebookAuthorizationException -> {
// User denied permissions or login failed
Log.e("Login", "Authorization failed: ${error.message}")
showPermissionExplanation()
}
is FacebookOperationCanceledException -> {
// User cancelled login
Log.d("Login", "Login cancelled by user")
}
is FacebookServiceException -> {
// Server-side error
Log.e("Login", "Server error: ${error.message}")
showRetryOption()
}
else -> {
// Other errors
Log.e("Login", "Login error: ${error.message}")
showGenericError()
}
}
}