---
title: "Construction Floor Plan"
canonical_url: "https://www.nutrient.io/guides/android/samples/construction-floor-plan-kotlin/"
md_url: "https://www.nutrient.io/guides/android/samples/construction-floor-plan-kotlin.md"
last_updated: "2026-05-15T19:10:04.916Z"
description: "Display a building floor plan with custom pin stamps, hide/show annotations, and a custom toolbar."
---

# Construction Floor Plan

Display a building floor plan with custom pin stamps, hide/show annotations, and a custom toolbar.

[Get Started](https://www.nutrient.io/sdk/android/getting-started.md)

[All Samples](https://www.nutrient.io/guides/android/samples.md)

[Download](https://www.nutrient.io/guides/android/downloads.md)

[Launch Demo](https://www.nutrient.io/demo/)

---

```kotlin

/*
 *   Copyright © 2022-2026 PSPDFKit GmbH. All rights reserved.
 *
 *   The PSPDFKit Sample applications are licensed with a modified BSD license.
 *   Please see License for details. This notice may not be removed from this file.
 */
@file:Suppress("DEPRECATION")

package com.pspdfkit.catalog.examples.kotlin

import android.content.Context
import android.net.Uri
import android.os.Bundle
import android.view.Menu
import androidx.appcompat.content.res.AppCompatResources
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.graphics.drawable.toBitmap
import androidx.lifecycle.lifecycleScope
import com.pspdfkit.annotations.Annotation
import com.pspdfkit.annotations.AnnotationFlags
import com.pspdfkit.annotations.AnnotationType
import com.pspdfkit.annotations.actions.HideAction
import com.pspdfkit.annotations.configuration.StampAnnotationConfiguration
import com.pspdfkit.annotations.stamps.StampPickerItem
import com.pspdfkit.catalog.R
import com.pspdfkit.catalog.tasks.ExtractAssetTask
import com.pspdfkit.configuration.activity.PdfActivityConfiguration
import com.pspdfkit.document.PdfDocument
import com.pspdfkit.ui.PdfActivity
import com.pspdfkit.ui.PdfActivityIntentBuilder
import com.pspdfkit.ui.annotations.OnAnnotatingModeChangeListener
import com.pspdfkit.ui.annotations.OnAnnotationSelectedListener
import com.pspdfkit.ui.special_mode.controller.AnnotatingController
import com.pspdfkit.ui.special_mode.controller.AnnotationSelectionController
import com.pspdfkit.ui.toolbar.AnnotationToolbar
import com.pspdfkit.ui.toolbar.ContextualToolbar
import com.pspdfkit.ui.toolbar.ToolbarCoordinatorLayout
import com.pspdfkit.ui.toolbar.grouping.presets.MenuItem
import com.pspdfkit.ui.toolbar.grouping.presets.PresetMenuItemGroupingRule
import kotlinx.coroutines.launch

class ConstructionExample(context: Context) :
    AssetExample(
        context,
        R.string.constructionExampleTitle,
        R.string.constructionExampleDescription,
    ) {
    override val assetPath: String = "Floor Plan.pdf"

    override fun prepareConfiguration(configuration: PdfActivityConfiguration.Builder) {
        super.prepareConfiguration(configuration)
        configuration.autosaveEnabled(false)
        // turn off the display of the note icon for annotations with an attached note
        configuration.setAnnotationNoteHintingEnabled(false)
        // Apply a custom theme which overrides the icon for the stamp toolbar button in the annotation creation toolbar
        configuration.theme(R.style.PSPDFCatalog_Theme_ConstructionExample)
        // Turn on measurements. This is on by default if you have it in your license.
        configuration.setMeasurementToolsEnabled(true)
    }

    override fun launchExample(context: Context, configuration: PdfActivityConfiguration.Builder) {
        prepareConfiguration(configuration)

        // Since Nutrient does not directly read documents from the assets, we extract them
        // to the internal device storage using a custom AsyncTask implementation.
        ExtractAssetTask.extract(assetPath, title, context) { documentFile ->
            // Now, as the PDF document file is sitting in the internal device storage, we can
            // start the ConstructionExampleActivity activity by passing it the Uri of the file.
            val intent =
                PdfActivityIntentBuilder.fromUri(context, Uri.fromFile(documentFile)).activityClass(ConstructionExampleActivity::class.java).configuration(configuration.build()).build()
            context.startActivity(intent)
        }
    }
}

class ConstructionExampleActivity :
    PdfActivity(),
    ToolbarCoordinatorLayout.OnContextualToolbarLifecycleListener,
    OnAnnotationSelectedListener,
    OnAnnotatingModeChangeListener {
    var annotationsHidden = false
    val desiredAnnotationTypes =
        AnnotationType.entries.toMutableSet().apply {
            // ignore LINK annotations
            remove(AnnotationType.LINK)
        }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // First we set the listener for the toolbar lifecycle changes so we
        // can observe when the toolbar is being prepared, shown or dismissed
        // inside the activity's UI.
        setOnContextualToolbarLifecycleListener(this)
    }

    override fun onDocumentLoaded(document: PdfDocument) {
        super.onDocumentLoaded(document)

        // Check if we have any hidden annotation. If so, we should show the "show" item in the options menu
        lifecycleScope.launch {
            val hasHiddenAnnotations =
                document.annotationProvider.getAllAnnotationsOfType(desiredAnnotationTypes).firstOrNull {
                    it.hasFlag(AnnotationFlags.HIDDEN)
                }!= null

            if (hasHiddenAnnotations!= annotationsHidden) {
                annotationsHidden = hasHiddenAnnotations
                invalidateOptionsMenu()
            }
        }

        setupPinStamp()
    }

    /**
     * Create a custom configuration for Stamp annotations which creates a Pin annotation.
     * This can be achieved by setting a single StampPickerItem (which visualizes a pin in our case) to the configuration,
     * which leads to a behavior change in the annotation creation. Instead of showing a stamp picker dialog, the stamp
     * annotation is created immediatly from this only item.
     */
    private fun setupPinStamp() {
        val fragment = requirePdfFragment()

        val pinBitmap =
            AppCompatResources.getDrawable(this, R.drawable.ic_pin_drop)?.toBitmap()?: return

        // First we create our custom StampPickerItem
        val pinStamp =
            StampPickerItem.fromBitmap(pinBitmap).withSize(50f, 50f).build()

        // Then put it into a StampAnnotationConfiguration
        val stampConfig =
            StampAnnotationConfiguration.builder(this)
                // Here we return list of stamp picker items that are going to be available in the stamp picker..setAvailableStampPickerItems(listOf(pinStamp)).build()

        // Replace the default StampAnnotationConfiguration with our custom one
        fragment.annotationConfiguration.put(AnnotationType.STAMP, stampConfig)

        // When creating such a pin stamp we always want to add a note to it.
        // To spare the user the extra click for adding a note, we invoke the NoteEditor automatically
        // Therefore we need two listeners which inform us when an annotation is created and when
        // the editing mode is invoked (both events happen right one after the other)
        fragment.addOnAnnotationSelectedListener(this)
        fragment.addOnAnnotatingModeChangeListener(this)
    }

    override fun onGenerateMenuItemIds(menuItems: MutableList<Int>): MutableList<Int> {
        // Generate our custom menu item ids.
        menuItems.add(0, R.id.custom_action_hide)
        menuItems.add(1, R.id.custom_action_show)
        menuItems.removeAt(menuItems.indexOf(MENU_OPTION_THUMBNAIL_GRID))
        return menuItems
    }

    // add show/hide annotation items to options menu
    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        super.onCreateOptionsMenu(menu)

        // Let's say we want to tint icons same as the default ones. We can read the color
        // from the theme, or specify the same color we have in theme. Reading from theme is a bit
        // more complex but a better way to do it, so here's how to:
        val a =
            theme.obtainStyledAttributes(
                    null,
                    com.pspdfkit.R.styleable.pspdf__ActionBarIcons,
                    com.pspdfkit.R.attr.pspdf__actionBarIconsStyle,
                    com.pspdfkit.R.style.PSPDFKit_ActionBarIcons,
                )
        val mainToolbarIconsColor =
            a.getColor(
                com.pspdfkit.R.styleable.pspdf__ActionBarIcons_pspdf__iconsColor,
                ContextCompat.getColor(this, com.pspdfkit.R.color.pspdf__onPrimary),
            )
        a.recycle()

        // setup our custom menu items for showing and hiding annotations
        setupCustomMenuItem(
            menu.findItem(R.id.custom_action_hide),
            "Hide",
            R.drawable.ic_hide,
            mainToolbarIconsColor,
        )
        setupCustomMenuItem(
            menu.findItem(R.id.custom_action_show),
            "Show",
            R.drawable.ic_show,
            mainToolbarIconsColor,
        )

        return true
    }

    private fun setupCustomMenuItem(item: android.view.MenuItem?, title: String, iconRes: Int, mainToolbarIconsColor: Int) {
        if (item == null) return
        item.title = title
        item.setIcon(iconRes)
        item.icon?.let { DrawableCompat.setTint(it, mainToolbarIconsColor) }
        item.setShowAsAction(android.view.MenuItem.SHOW_AS_ACTION_IF_ROOM)
    }

    override fun onPrepareOptionsMenu(menu: Menu): Boolean {
        val result = super.onPrepareOptionsMenu(menu)

        // we only want to show either of our custom menu items, depending on the visible/hidden state of our annotations
        menu.findItem(R.id.custom_action_hide)?.let {
            it.isVisible =!annotationsHidden
        }
        menu.findItem(R.id.custom_action_show)?.let {
            it.isVisible = annotationsHidden
        }
        return result
    }

    override fun onOptionsItemSelected(item: android.view.MenuItem): Boolean {
        when (item.itemId) {
            R.id.custom_action_hide,
            R.id.custom_action_show,
            -> {
                // show/hide annotations accordingly and update the option menu
                annotationsHidden =!annotationsHidden
                setAnnotationVisibility(annotationsHidden)
                invalidateOptionsMenu()
                return true
            }

            else -> {
                return super.onOptionsItemSelected(item)
            }
        }
    }

    // add or remove the HIDDEN flag to the annotations to achieve the hide/show effect
    private fun setAnnotationVisibility(shouldHide: Boolean) {
        val doc = document?: return
        lifecycleScope.launch {
            val annotations =
                doc.annotationProvider.getAllAnnotationsOfType(desiredAnnotationTypes)

            pdfFragment?.executeAction(HideAction(annotations, null, shouldHide))
        }
    }

    //region OnContextualToolbarLifecycleListener
    override fun onPrepareContextualToolbar(toolbar: ContextualToolbar<*>) {
        if (toolbar is AnnotationToolbar) {
            // Register grouping rule to tell toolbar how to group menu items.
            toolbar.setMenuItemGroupingRule(
                CustomAnnotationCreationToolbarGroupingRule(this),
            )
        }
    }

    override fun onDisplayContextualToolbar(toolbar: ContextualToolbar<*>) {}

    override fun onRemoveContextualToolbar(toolbar: ContextualToolbar<*>) {}
    //endregion

    private var newPinAnnotationCreated = false

    //region OnAnnotationSelectedListener
    override fun onPrepareAnnotationSelection(
        controller: AnnotationSelectionController,
        annotation: Annotation,
        annotationCreated: Boolean,
    ): Boolean {
        // since our custom pin is the only stamp that we create in this example we can just use the type for detection
        newPinAnnotationCreated = annotationCreated && annotation.type == AnnotationType.STAMP
        return true
    }

    override fun onAnnotationSelected(annotation: Annotation, annotationCreated: Boolean) {}
    //endregion

    //region OnAnnotatingModeChangeListener
    override fun onEnterAnnotatingMode(controller: AnnotatingController) {
        // in case the last annotation selection was in context with a pin creation, invoke the note editor
        if (newPinAnnotationCreated && controller.hasCurrentlySelectedAnnotations()) {
            controller.currentSingleSelectedAnnotation?.let {
                controller.showAnnotationEditor(it)
            }
        }
    }

    override fun onChangeAnnotatingMode(controller: AnnotatingController) {}

    override fun onExitAnnotatingMode(controller: AnnotatingController) {}
    //endregion

    /**
     * Class that implements the [PresetMenuItemGroupingRule], used to tell the toolbar how to
     * group menu items in the toolbar.
     *
     * @see com.pspdfkit.catalog.ui.CustomAnnotationCreationToolbarGroupingRule for more details.
     */
    private class CustomAnnotationCreationToolbarGroupingRule constructor(context: Context) : PresetMenuItemGroupingRule(context) {
        companion object {
            private const val LOW_CAPACITY_ITEMS_COUNT = 5
            private const val HIGH_CAPACITY_ITEMS_COUNT = 7
        }

        private val lowCapacityItemsGrouping: MutableList<MenuItem> = ArrayList(LOW_CAPACITY_ITEMS_COUNT)
        private val highCapacityItemsGrouping: MutableList<MenuItem> = ArrayList(HIGH_CAPACITY_ITEMS_COUNT)

        override fun getGroupPreset(capacity: Int, itemsCount: Int): List<MenuItem> = when {
            capacity >= HIGH_CAPACITY_ITEMS_COUNT -> highCapacityItemsGrouping

            capacity >= LOW_CAPACITY_ITEMS_COUNT -> lowCapacityItemsGrouping

            // in case we don't have enough capacity, return an empty list
            else -> ArrayList(capacity)
        }

        override fun areGeneratedGroupItemsSelectable(): Boolean = true

        init {
            lowCapacityItemsGrouping.addAll(
                listOf(
                    MenuItem(
                        com.pspdfkit.R.id.pspdf__annotation_toolbar_group_drawing,
                        intArrayOf(
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_line,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_line_arrow,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_ink_pen,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_magic_ink,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_freetext,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_freetext_callout,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_note,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_measurement_distance,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_measurement_perimeter,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_measurement_area_polygon,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_measurement_area_rect,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_measurement_area_ellipse,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_measurement_scale_calibration,
                        ),
                    ),
                    MenuItem(
                        com.pspdfkit.R.id.pspdf__annotation_toolbar_group_markup,
                        intArrayOf(
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_cloudy_square,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_cloudy_circle,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_dashed_square,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_dashed_circle,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_square,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_circle,
                        ),
                    ),
                    MenuItem(com.pspdfkit.R.id.pspdf__annotation_toolbar_item_image),
                    MenuItem(com.pspdfkit.R.id.pspdf__annotation_toolbar_item_stamp),
                    MenuItem(com.pspdfkit.R.id.pspdf__annotation_toolbar_item_picker),
                    MenuItem(
                        com.pspdfkit.R.id.pspdf__annotation_toolbar_group_undo_redo,
                        intArrayOf(
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_undo,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_redo,
                        ),
                    ),
                ),
            )
            highCapacityItemsGrouping.addAll(
                listOf(
                    MenuItem(
                        com.pspdfkit.R.id.pspdf__annotation_toolbar_group_measurement,
                        intArrayOf(
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_measurement_distance,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_measurement_perimeter,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_measurement_area_polygon,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_measurement_area_rect,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_measurement_area_ellipse,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_measurement_scale_calibration,
                        ),
                    ),
                    MenuItem(
                        com.pspdfkit.R.id.pspdf__annotation_toolbar_group_drawing,
                        intArrayOf(
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_line,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_line_arrow,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_ink_pen,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_magic_ink,
                        ),
                    ),
                    MenuItem(
                        com.pspdfkit.R.id.pspdf__annotation_toolbar_group_markup,
                        intArrayOf(
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_cloudy_square,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_cloudy_circle,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_dashed_square,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_dashed_circle,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_square,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_circle,
                        ),
                    ),
                    MenuItem(
                        com.pspdfkit.R.id.pspdf__annotation_toolbar_group_writing,
                        intArrayOf(
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_freetext,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_freetext_callout,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_note,
                        ),
                    ),
                    MenuItem(com.pspdfkit.R.id.pspdf__annotation_toolbar_item_image),
                    MenuItem(com.pspdfkit.R.id.pspdf__annotation_toolbar_item_stamp),
                    MenuItem(com.pspdfkit.R.id.pspdf__annotation_toolbar_item_picker),
                    MenuItem(
                        com.pspdfkit.R.id.pspdf__annotation_toolbar_group_undo_redo,
                        intArrayOf(
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_undo,
                            com.pspdfkit.R.id.pspdf__annotation_toolbar_item_redo,
                        ),
                    ),
                ),
            )
        }
    }
}

```

This code sample is an example that illustrates how to use our SDK. Please adapt it to your specific use case.

---

## Related pages

- [Application Policy](/guides/android/samples/application-policy-kotlin.md)
- [Custom Form Highlight Color](/guides/android/samples/custom-form-highlight-color-java.md)
- [Custom Page Templates](/guides/android/samples/custom-page-templates-java.md)
- [Digital Signature (Basic)](/guides/android/samples/digital-signature-basic-kotlin.md)
- [Disabled Annotation Property](/guides/android/samples/disabled-annotation-property-java.md)
- [Image Document](/guides/android/samples/image-document-kotlin.md)
- [Compose Image Document](/guides/android/samples/compose-image-document-kotlin.md)
- [Inline Multimedia](/guides/android/samples/inline-multimedia-kotlin.md)
- [JavaScript Form Filling](/guides/android/samples/javascript-form-filling-kotlin.md)
- [Overlay Visibility](/guides/android/samples/overlay-visibility-kotlin.md)
- [PdfFragment](/guides/android/samples/pdffragment-kotlin.md)
- [Reader View](/guides/android/samples/reader-view-kotlin.md)
- [Playground](/guides/android/samples/playground-kotlin.md)
- [JavaScript Calculator](/guides/android/samples/javascript-calculator-kotlin.md)
- [Text Field Suggestions](/guides/android/samples/text-field-suggestions-kotlin.md)
- [Thumbnail Bar Modes](/guides/android/samples/thumbnail-bar-modes-kotlin.md)
- [Signature Storage Database](/guides/android/samples/signature-storage-database-kotlin.md)
- [Selection Customization](/guides/android/samples/selection-customization-java.md)
- [Password Protected PDF](/guides/android/samples/password-protected-pdf-kotlin.md)
- [Scientific Paper](/guides/android/samples/scientific-paper-kotlin.md)
- [Try Instant](/guides/android/samples/try-instant-kotlin.md)
- [Merge Documents](/guides/android/samples/merge-documents-kotlin.md)
- [Annotation Rendering](/guides/android/samples/annotation-rendering-kotlin.md)
- [Custom Data Provider](/guides/android/samples/custom-data-provider-kotlin.md)
- [Annotations with Transparency](/guides/android/samples/annotations-with-transparency-kotlin.md)
- [Annotation Flags](/guides/android/samples/annotation-flags-kotlin.md)
- [AI Assistant (Multiple Documents, ViewPager)](/guides/android/samples/ai-assistant-multiple-documents-viewpager-kotlin.md)
- [Custom Sharing Menu](/guides/android/samples/custom-sharing-menu-java.md)
- [Add LTV to Existing Signature](/guides/android/samples/add-ltv-to-existing-signature-kotlin.md)
- [Custom Toolbar Grouping](/guides/android/samples/custom-toolbar-grouping-java.md)
- [Custom Layout](/guides/android/samples/custom-layout-kotlin.md)
- [Custom ActionBar Actions](/guides/android/samples/custom-actionbar-actions-kotlin.md)
- [Custom Activity Toolbars](/guides/android/samples/custom-activity-toolbars-java.md)
- [Custom Note Hinter](/guides/android/samples/custom-note-hinter-kotlin.md)
- [Custom Main Toolbar](/guides/android/samples/custom-main-toolbar-kotlin.md)
- [Annotation Configuration](/guides/android/samples/annotation-configuration-kotlin.md)
- [Annotation Selection Styling](/guides/android/samples/annotation-selection-styling-kotlin.md)
- [Custom Search UI (Compose)](/guides/android/samples/custom-search-ui-compose-kotlin.md)
- [Document Switcher](/guides/android/samples/document-switcher-java.md)
- [File Annotation Creation](/guides/android/samples/file-annotation-creation-kotlin.md)
- [Dynamic Pages on Scroll](/guides/android/samples/dynamic-pages-on-scroll-kotlin.md)
- [Custom Activity Form Editing](/guides/android/samples/custom-activity-form-editing-java.md)
- [Custom Stamp Annotations](/guides/android/samples/custom-stamp-annotations-java.md)
- [Custom Outline Provider](/guides/android/samples/custom-outline-provider-kotlin.md)
- [Compose Navigation](/guides/android/samples/compose-navigation-kotlin.md)
- [Fragment Runtime Configuration](/guides/android/samples/fragment-runtime-configuration-kotlin.md)
- [Annotation Overlay](/guides/android/samples/annotation-overlay-java.md)
- [Instant Document JSON](/guides/android/samples/instant-document-json-kotlin.md)
- [DocumentView Composable](/guides/android/samples/documentview-composable-kotlin.md)
- [Form Creation](/guides/android/samples/form-creation-kotlin.md)
- [Document Download](/guides/android/samples/document-download-kotlin.md)
- [JavaScript Actions](/guides/android/samples/javascript-actions-kotlin.md)
- [Instant JSON Attachment](/guides/android/samples/instant-json-attachment-kotlin.md)
- [Digital Signature (Manual)](/guides/android/samples/digital-signature-manual-kotlin.md)
- [Digital Signature (Third-Party)](/guides/android/samples/digital-signature-third-party-kotlin.md)
- [Inline Search](/guides/android/samples/inline-search-java.md)
- [Form Filling](/guides/android/samples/form-filling-kotlin.md)
- [Form Click Intercept (Compose)](/guides/android/samples/form-click-intercept-compose-kotlin.md)
- [Document Sharing](/guides/android/samples/document-sharing-java.md)
- [Custom Download Dialog](/guides/android/samples/custom-download-dialog-java.md)
- [Download Progress](/guides/android/samples/download-progress-kotlin.md)
- [Popup Toolbar Customization](/guides/android/samples/popup-toolbar-customization-kotlin.md)
- [Custom Sharing Dialog](/guides/android/samples/custom-sharing-dialog-java.md)
- [PDF from Image](/guides/android/samples/pdf-from-image-kotlin.md)
- [Digital Signature (Two-Step)](/guides/android/samples/digital-signature-two-step-kotlin.md)
- [Remote URL](/guides/android/samples/remote-url-kotlin.md)
- [PdfUiFragment](/guides/android/samples/pdfuifragment-kotlin.md)
- [Runtime Configuration](/guides/android/samples/runtime-configuration-kotlin.md)
- [Sound Extraction](/guides/android/samples/sound-extraction-kotlin.md)
- [Document from Canvas](/guides/android/samples/document-from-canvas-kotlin.md)
- [Tabbed Documents](/guides/android/samples/tabbed-documents-kotlin.md)
- [Watermarks](/guides/android/samples/watermarks-kotlin.md)
- [Programmatic Zoom](/guides/android/samples/programmatic-zoom-kotlin.md)
- [Signature Parcelize](/guides/android/samples/signature-parcelize-kotlin.md)
- [OCR](/guides/android/samples/ocr-kotlin.md)
- [Vertical Scrollbar](/guides/android/samples/vertical-scrollbar-java.md)
- [Split View](/guides/android/samples/split-view-java.md)
- [XFDF Import/Export](/guides/android/samples/xfdf-import-export-kotlin.md)
- [UI View Modes](/guides/android/samples/ui-view-modes-kotlin.md)
- [LTV Signature](/guides/android/samples/ltv-signature-kotlin.md)
- [Bookmark Highlighting](/guides/android/samples/bookmark-highlighting-kotlin.md)
- [Custom Annotation Inspector](/guides/android/samples/custom-annotation-inspector-java.md)
- [Annotation Sidebar](/guides/android/samples/annotation-sidebar-kotlin.md)
- [AI Assistant (Single Document)](/guides/android/samples/ai-assistant-single-document-kotlin.md)
- [AI Assistant (Multiple Documents, Compose)](/guides/android/samples/ai-assistant-multiple-documents-compose-kotlin.md)
- [Document Comparison](/guides/android/samples/document-comparison-kotlin.md)
- [Document Processing](/guides/android/samples/document-processing-kotlin.md)
- [Custom Annotation Creation Toolbar](/guides/android/samples/custom-annotation-creation-toolbar-java.md)
- [Custom Electronic Signature](/guides/android/samples/custom-electronic-signature-java.md)
- [E-Learning](/guides/android/samples/e-learning-kotlin.md)
- [Electronic + Digital Signing](/guides/android/samples/electronic-digital-signing-kotlin.md)
- [Generate PDF Report](/guides/android/samples/generate-pdf-report-kotlin.md)
- [Multimedia Annotations](/guides/android/samples/multimedia-annotations-kotlin.md)
- [Forms with JavaScript](/guides/android/samples/forms-with-javascript-kotlin.md)
- [External Document](/guides/android/samples/external-document-kotlin.md)
- [Overlay Views](/guides/android/samples/overlay-views-kotlin.md)
- [Kiosk Grid](/guides/android/samples/kiosk-grid-kotlin.md)
- [Search Indexing](/guides/android/samples/search-indexing-kotlin.md)
- [Annotation Creation](/guides/android/samples/annotation-creation-kotlin.md)
- [Filterable Thumbnail Grid](/guides/android/samples/filterable-thumbnail-grid-kotlin.md)
- [Tabbed Documents (Persistent)](/guides/android/samples/tabbed-documents-persistent-kotlin.md)
- [Measurement Tools](/guides/android/samples/measurement-tools-kotlin.md)
- [HTML-to-PDF Conversion](/guides/android/samples/html-to-pdf-conversion-kotlin.md)
- [AES Encrypted File](/guides/android/samples/aes-encrypted-file-java.md)
- [Hide and Reveal Areas](/guides/android/samples/hide-and-reveal-areas-kotlin.md)
- [Multiple Documents (Compose Pager)](/guides/android/samples/multiple-documents-compose-pager-kotlin.md)
- [Screen Reader](/guides/android/samples/screen-reader-java.md)
- [Custom Search UI (Views)](/guides/android/samples/custom-search-ui-views-java.md)

