Form Intercept with Compose
Shows how to intercept form click with the DocumentView Composable.
/* * Copyright © 2024-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. */
package com.pspdfkit.catalog.examples.kotlin
import android.content.Contextimport android.content.Intentimport android.net.Uriimport android.os.Bundleimport android.util.Logimport android.widget.Toastimport androidx.activity.compose.setContentimport androidx.appcompat.app.AppCompatActivityimport androidx.compose.foundation.layout.Boximport androidx.compose.foundation.layout.fillMaxSizeimport androidx.compose.foundation.layout.paddingimport androidx.compose.material3.Scaffoldimport androidx.compose.ui.Modifierimport androidx.compose.ui.platform.LocalContextimport com.pspdfkit.catalog.Rimport com.pspdfkit.catalog.SdkExampleimport com.pspdfkit.catalog.SdkExample.Companion.TAGimport com.pspdfkit.catalog.tasks.ExtractAssetTaskimport com.pspdfkit.configuration.activity.PdfActivityConfigurationimport com.pspdfkit.configuration.activity.UserInterfaceViewModeimport com.pspdfkit.jetpack.compose.interactors.DefaultListenersimport com.pspdfkit.jetpack.compose.interactors.getDefaultDocumentManagerimport com.pspdfkit.jetpack.compose.interactors.rememberDocumentStateimport com.pspdfkit.jetpack.compose.views.DocumentViewimport com.pspdfkit.utils.getSupportParcelableExtra
class FormClickInterceptExample(context: Context) : SdkExample(context, R.string.formInterceptExampleTitle, R.string.formInterceptExampleDescription) { /** Configuration is handled inside [FormInterceptActivity] */ override fun launchExample(context: Context, configuration: PdfActivityConfiguration.Builder) { ExtractAssetTask.extract(WELCOME_DOC, title, context) { documentFile -> val intent = Intent(context, FormInterceptActivity::class.java) intent.putExtra(FormInterceptActivity.EXTRA_URI, Uri.fromFile(documentFile)) context.startActivity(intent) } }}
class FormInterceptActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)
val uri = intent.getSupportParcelableExtra(EXTRA_URI, Uri::class.java)!!
setContent { Scaffold { paddingValues -> val pdfActivityConfiguration = PdfActivityConfiguration .Builder(this) .setUserInterfaceViewMode(UserInterfaceViewMode.USER_INTERFACE_VIEW_MODE_HIDDEN) .build()
val documentState = rememberDocumentState(uri, pdfActivityConfiguration)
val context = LocalContext.current Box(Modifier.padding(paddingValues)) { DocumentView( documentState = documentState, modifier = Modifier.fillMaxSize(), documentManager = getDefaultDocumentManager( documentListener = DefaultListeners.documentListeners( onDocumentLoaded = { Log.e(TAG, "onDocumentLoaded ${it.title}") documentState.documentConnection.setPageIndex(16) }, onPageChanged = { document, page -> Log.e(TAG, "onPageChanged: ${document.title} - $page") }, onDocumentSaved = { Log.e(TAG, "onDocumentSaved ${it.title}") }, onDocumentZoomed = { document, pageIndex, scaleFactor -> Log.e(TAG, "onDocumentZoomed: ${document.title} $pageIndex $scaleFactor") } ), annotationListener = DefaultListeners.annotationListeners( onAnnotationSelected = { annotation, created -> Log.e(TAG, "onAnnotationSelected: ${annotation.type.name} $created") }, onAnnotationDeselected = { annotation, created -> Log.e(TAG, "onAnnotationDeselected: ${annotation.type.name} $created") } ), formListener = DefaultListeners.formListeners( onFormElementClickedListener = { formElement -> Toast.makeText( context, "Clicked form of type ${formElement.type}", Toast.LENGTH_SHORT ).show() true }, onFormElementViewUpdatedListener = { formElement -> println("Form click addOnFormElementViewUpdatedListener formElement ${formElement.type}") true }, onFormElementValidationSuccess = { formElement -> println("Form click addOnFormElementValidationSuccess formElement ${formElement.type}") true }, onFormElementValidationFailed = { formElement, error -> println("Form click addOnFormElementValidationFailed formElement ${formElement.type} error $error") true }, onEnterFormElementEditingMode = { println("Form click addOnEnterFormElementEditingMode") true }, onChangeFormElementEditingMode = { println("Form click addOnChangeFormElementEditingMode") true }, onExitFormElementEditingMode = { println("Form click addOnExitFormElementEditingMode") true }, onFormElementUpdatedListener = { formElement -> println("Form click addOnFormElementUpdatedListener formElement ${formElement.type}") true }, onFormElementSelectedListener = { formElement -> println("Form click addOnFormElementSelectedListener formElement ${formElement.type}") true }, onFormElementDeselectedListener = { formElement, _ -> println("Form click addOnFormElementDeselectedListener formElement ${formElement.type}") true } ) ) ) } } } }
companion object { const val EXTRA_URI = "JetpackComposeActivity.DocumentUri" }}This code sample is an example that illustrates how to use our SDK. Please adapt it to your specific use case.