or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

app-events.mdapp-links.mdbolts-tasks.mdcore-authentication.mdgaming.mdgraph-api.mdindex.mdlogin.mdmessenger.mdsharing.md
tile.json

login.mddocs/

Facebook Login

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.

Login Manager

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)
}

Basic Login Example

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)
    }
}

Login Button

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
    }
}

Login Button Usage

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)
    }
}

Login Results

data class LoginResult(
    val accessToken: AccessToken,
    val recentlyGrantedPermissions: Set<String>,
    val recentlyDeniedPermissions: Set<String>
)

Device Login

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
)

Profile Picture View

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?)
}

Profile Picture Usage

// 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}")
}

Access Token Tracking

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?
    )
}

Access Token Tracking Example

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()

Login Configuration

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)

Error Handling

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()
        }
    }
}