CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-com-facebook-android--facebook-android-sdk

Facebook SDK for Android providing comprehensive integration with Facebook platform features including Login, Sharing, Messenger, App Links, Analytics, and Graph API

Pending
Overview
Eval results
Files

sharing.mddocs/

Content Sharing

The Facebook Share module provides comprehensive content sharing capabilities including links, photos, videos, and Open Graph stories. It supports both programmatic sharing via ShareApi and UI-based sharing through various dialog implementations.

Share API

Programmatic sharing without user interaction:

class ShareApi(
    content: ShareContent<*, *>,
    mode: ShareApi.Mode
) {
    enum class Mode {
        AUTOMATIC,  // Choose best available method
        NATIVE,     // Use native Facebook app
        WEB         // Use web-based sharing
    }
    
    fun share(callback: FacebookCallback<Sharer.Result>?)
    fun canShare(): Boolean
    
    companion object {
        fun share(
            activity: Activity,
            shareContent: ShareContent<*, *>,
            callback: FacebookCallback<Sharer.Result>?
        )
    }
}

interface Sharer {
    data class Result(val postId: String?)
}

Share API Usage

// Create share content
val linkContent = ShareLinkContent.Builder()
    .setContentUrl(Uri.parse("https://example.com"))
    .setQuote("Check out this amazing content!")
    .build()

// Share programmatically
val shareApi = ShareApi(linkContent, ShareApi.Mode.AUTOMATIC)
if (shareApi.canShare()) {
    shareApi.share(object : FacebookCallback<Sharer.Result> {
        override fun onSuccess(result: Sharer.Result) {
            Log.d("Share", "Shared successfully, post ID: ${result.postId}")
        }
        
        override fun onCancel() {
            Log.d("Share", "Share cancelled")
        }
        
        override fun onError(error: FacebookException) {
            Log.e("Share", "Share error: ${error.message}")
        }
    })
} else {
    Log.w("Share", "Cannot share this content type")
}

Share Dialogs

UI-based sharing dialogs that provide a rich sharing experience:

class ShareDialog : FacebookDialogBase<ShareContent<*, *>, ShareDialog.Result> {
    constructor(activity: Activity)
    constructor(fragment: Fragment)
    constructor(fragment: android.app.Fragment)
    
    companion object {
        fun canShow(contentType: Class<out ShareContent<*, *>>): Boolean
    }
    
    fun show(content: ShareContent<*, *>)
    fun registerCallback(
        callbackManager: CallbackManager,
        callback: FacebookCallback<Result>
    )
    
    data class Result(val postId: String?)
}

class MessageDialog : FacebookDialogBase<ShareContent<*, *>, MessageDialog.Result> {
    constructor(activity: Activity)
    constructor(fragment: Fragment)
    
    companion object {
        fun canShow(contentType: Class<out ShareContent<*, *>>): Boolean
    }
    
    fun show(content: ShareContent<*, *>)
    
    data class Result(val requestId: String?)
}

Share Dialog Usage

class SharingActivity : AppCompatActivity() {
    private lateinit var callbackManager: CallbackManager
    private lateinit var shareDialog: ShareDialog
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        callbackManager = CallbackManager.Factory.create()
        shareDialog = ShareDialog(this)
        
        shareDialog.registerCallback(callbackManager, object : FacebookCallback<ShareDialog.Result> {
            override fun onSuccess(result: ShareDialog.Result) {
                Log.d("Share", "Content shared successfully")
            }
            
            override fun onCancel() {
                Log.d("Share", "Share cancelled")
            }
            
            override fun onError(error: FacebookException) {
                Log.e("Share", "Share error: ${error.message}")
            }
        })
        
        // Share a link
        shareLink()
    }
    
    private fun shareLink() {
        val content = ShareLinkContent.Builder()
            .setContentUrl(Uri.parse("https://developers.facebook.com"))
            .setQuote("Learn how to integrate Facebook into your app!")
            .build()
            
        if (ShareDialog.canShow(ShareLinkContent::class.java)) {
            shareDialog.show(content)
        }
    }
    
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        callbackManager.onActivityResult(requestCode, resultCode, data)
        super.onActivityResult(requestCode, resultCode, data)
    }
}

Share Content Types

Base Share Content

abstract class ShareContent<P : ShareContent<P, E>, E : ShareContent.Builder<P, E>> {
    val contentUrl: Uri?
    val peopleIds: List<String>
    val placeId: String?
    val ref: String?
    val shareHashtag: ShareHashtag?
    
    abstract class Builder<P : ShareContent<P, E>, E : Builder<P, E>> {
        fun setContentUrl(contentUrl: Uri?): E
        fun setPeopleIds(peopleIds: List<String>?): E
        fun setPlaceId(placeId: String?): E
        fun setRef(ref: String?): E
        fun setShareHashtag(shareHashtag: ShareHashtag?): E
        abstract fun build(): P
    }
}

data class ShareHashtag(val hashtag: String) {
    class Builder {
        fun setHashtag(hashtag: String?): Builder
        fun build(): ShareHashtag
    }
}

Link Content

class ShareLinkContent : ShareContent<ShareLinkContent, ShareLinkContent.Builder> {
    val quote: String?
    
    class Builder : ShareContent.Builder<ShareLinkContent, Builder>() {
        fun setQuote(quote: String?): Builder
        override fun build(): ShareLinkContent
    }
}

Photo Content

class SharePhotoContent : ShareContent<SharePhotoContent, SharePhotoContent.Builder> {
    val photos: List<SharePhoto>
    
    class Builder : ShareContent.Builder<SharePhotoContent, Builder>() {
        fun setPhotos(photos: List<SharePhoto>?): Builder
        fun addPhoto(photo: SharePhoto?): Builder
        override fun build(): SharePhotoContent
    }
}

class SharePhoto {
    val bitmap: Bitmap?
    val imageUrl: Uri?
    val caption: String?
    val userGenerated: Boolean
    
    class Builder {
        fun setBitmap(bitmap: Bitmap?): Builder
        fun setImageUrl(imageUrl: Uri?): Builder
        fun setCaption(caption: String?): Builder
        fun setUserGenerated(userGenerated: Boolean): Builder
        fun build(): SharePhoto
    }
}

Video Content

class ShareVideoContent : ShareContent<ShareVideoContent, ShareVideoContent.Builder> {
    val video: ShareVideo
    val previewPhoto: SharePhoto?
    
    class Builder : ShareContent.Builder<ShareVideoContent, Builder>() {
        fun setVideo(video: ShareVideo?): Builder
        fun setPreviewPhoto(previewPhoto: SharePhoto?): Builder
        override fun build(): ShareVideoContent
    }
}

class ShareVideo {
    val localUrl: Uri?
    
    class Builder {
        fun setLocalUrl(localUrl: Uri?): Builder
        fun build(): ShareVideo
    }
}

Media Content

class ShareMediaContent : ShareContent<ShareMediaContent, ShareMediaContent.Builder> {
    val media: List<ShareMedia>
    
    class Builder : ShareContent.Builder<ShareMediaContent, Builder>() {
        fun setMedia(media: List<ShareMedia>?): Builder
        fun addMedium(medium: ShareMedia?): Builder
        override fun build(): ShareMediaContent
    }
}

interface ShareMedia

Photo Sharing Example

fun sharePhotos(bitmaps: List<Bitmap>) {
    val photos = bitmaps.map { bitmap ->
        SharePhoto.Builder()
            .setBitmap(bitmap)
            .setCaption("Shared from my app")
            .setUserGenerated(true)
            .build()
    }
    
    val content = SharePhotoContent.Builder()
        .setPhotos(photos)
        .setShareHashtag(ShareHashtag.Builder().setHashtag("#MyApp").build())
        .build()
    
    if (ShareDialog.canShow(SharePhotoContent::class.java)) {
        shareDialog.show(content)
    }
}

Video Sharing Example

fun shareVideo(videoUri: Uri, previewBitmap: Bitmap?) {
    val video = ShareVideo.Builder()
        .setLocalUrl(videoUri)
        .build()
    
    val contentBuilder = ShareVideoContent.Builder()
        .setVideo(video)
    
    if (previewBitmap != null) {
        val previewPhoto = SharePhoto.Builder()
            .setBitmap(previewBitmap)
            .build()
        contentBuilder.setPreviewPhoto(previewPhoto)
    }
    
    val content = contentBuilder.build()
    
    if (ShareDialog.canShow(ShareVideoContent::class.java)) {
        shareDialog.show(content)
    }
}

Share Buttons

UI components for easy sharing integration:

class ShareButton : ShareButtonBase {
    constructor(context: Context)
    constructor(context: Context, attrs: AttributeSet?)
    
    var shareContent: ShareContent<*, *>?
    
    fun registerCallback(
        callbackManager: CallbackManager,
        callback: FacebookCallback<Sharer.Result>
    )
}

class SendButton : ShareButtonBase {
    constructor(context: Context)
    constructor(context: Context, attrs: AttributeSet?)
    
    var shareContent: ShareContent<*, *>?
    
    fun registerCallback(
        callbackManager: CallbackManager,
        callback: FacebookCallback<Sharer.Result>
    )
}

abstract class ShareButtonBase : FacebookButtonBase {
    protected val requestCode: Int
    
    protected abstract fun getDialog(): FacebookDialogBase<*, *>?
}

Share Button Usage

// In your layout: <com.facebook.share.widget.ShareButton ... />
val shareButton: ShareButton = findViewById(R.id.share_button)

// Set content to share
val linkContent = ShareLinkContent.Builder()
    .setContentUrl(Uri.parse("https://example.com"))
    .setQuote("Check this out!")
    .build()

shareButton.shareContent = linkContent

// Register callback
shareButton.registerCallback(callbackManager, object : FacebookCallback<Sharer.Result> {
    override fun onSuccess(result: Sharer.Result) {
        Log.d("Share", "Shared successfully")
    }
    
    override fun onCancel() {
        Log.d("Share", "Share cancelled")
    }
    
    override fun onError(error: FacebookException) {
        Log.e("Share", "Share error: ${error.message}")
    }
})

Game Requests

Send game requests to friends:

class GameRequestDialog : FacebookDialogBase<GameRequestContent, GameRequestDialog.Result> {
    constructor(activity: Activity)
    constructor(fragment: Fragment)
    
    companion object {
        fun canShow(): Boolean
    }
    
    fun show(content: GameRequestContent)
    
    data class Result(
        val requestId: String,
        val to: List<String>
    )
}

class GameRequestContent : ShareContent<GameRequestContent, GameRequestContent.Builder> {
    val message: String
    val recipients: List<String>?
    val title: String?
    val data: String?
    val actionType: ActionType?
    val objectId: String?
    val filters: Filters?
    val suggestions: List<String>?
    
    enum class ActionType {
        SEND, ASKFOR, TURN
    }
    
    enum class Filters {
        APP_USERS, APP_NON_USERS
    }
    
    class Builder : ShareContent.Builder<GameRequestContent, Builder>() {
        fun setMessage(message: String): Builder
        fun setRecipients(recipients: List<String>?): Builder
        fun setTitle(title: String?): Builder
        fun setData(data: String?): Builder
        fun setActionType(actionType: ActionType?): Builder
        fun setObjectId(objectId: String?): Builder
        fun setFilters(filters: Filters?): Builder
        fun setSuggestions(suggestions: List<String>?): Builder
        override fun build(): GameRequestContent
    }
}

Game Request Example

fun sendGameRequest() {
    val content = GameRequestContent.Builder()
        .setMessage("Come play with me!")
        .setTitle("Join My Game")
        .setActionType(GameRequestContent.ActionType.SEND)
        .setFilters(GameRequestContent.Filters.APP_NON_USERS)
        .build()
    
    val dialog = GameRequestDialog(this)
    dialog.registerCallback(callbackManager, object : FacebookCallback<GameRequestDialog.Result> {
        override fun onSuccess(result: GameRequestDialog.Result) {
            Log.d("GameRequest", "Request sent to ${result.to.size} friends")
        }
        
        override fun onCancel() {
            Log.d("GameRequest", "Request cancelled")
        }
        
        override fun onError(error: FacebookException) {
            Log.e("GameRequest", "Request error: ${error.message}")
        }
    })
    
    if (GameRequestDialog.canShow()) {
        dialog.show(content)
    }
}

Open Graph Sharing

Share Open Graph stories:

class ShareOpenGraphContent : ShareContent<ShareOpenGraphContent, ShareOpenGraphContent.Builder> {
    val action: ShareOpenGraphAction
    val previewPropertyName: String
    
    class Builder : ShareContent.Builder<ShareOpenGraphContent, Builder>() {
        fun setAction(action: ShareOpenGraphAction): Builder
        fun setPreviewPropertyName(previewPropertyName: String): Builder
        override fun build(): ShareOpenGraphContent
    }
}

class ShareOpenGraphAction {
    val actionType: String
    
    fun putString(key: String, value: String?): ShareOpenGraphAction
    fun putStringArrayList(key: String, value: ArrayList<String>?): ShareOpenGraphAction
    fun putObject(key: String, value: ShareOpenGraphObject?): ShareOpenGraphAction
    fun putObjectArrayList(key: String, value: ArrayList<ShareOpenGraphObject>?): ShareOpenGraphAction
    
    class Builder(actionType: String, objectKey: String) {
        fun putString(key: String, value: String?): Builder
        fun putObject(key: String, value: ShareOpenGraphObject?): Builder
        fun build(): ShareOpenGraphAction
    }
}

class ShareOpenGraphObject {
    fun putString(key: String, value: String?): ShareOpenGraphObject
    fun putPhoto(key: String, value: SharePhoto?): ShareOpenGraphObject
    fun putStringArrayList(key: String, value: ArrayList<String>?): ShareOpenGraphObject
    
    class Builder {
        fun putString(key: String, value: String?): Builder
        fun putPhoto(key: String, value: SharePhoto?): Builder
        fun build(): ShareOpenGraphObject
    }
}

Install with Tessl CLI

npx tessl i tessl/maven-com-facebook-android--facebook-android-sdk

docs

app-events.md

app-links.md

bolts-tasks.md

core-authentication.md

gaming.md

graph-api.md

index.md

login.md

messenger.md

sharing.md

tile.json